Merge "Fixed dependencies for jquery.collapsibleTabs"
authorNikerabbit <niklas.laxstrom@gmail.com>
Fri, 19 Oct 2012 19:38:14 +0000 (19:38 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 19 Oct 2012 19:38:14 +0000 (19:38 +0000)
886 files changed:
.gitignore
RELEASE-NOTES-1.20
RELEASE-NOTES-1.21
bin/ulimit4.sh [changed mode: 0755->0644]
docs/contenthandler.txt [new file with mode: 0644]
docs/export-0.8.xsd [new file with mode: 0644]
docs/hooks.txt
docs/memcached.txt
includes/Action.php
includes/Article.php
includes/AutoLoader.php
includes/Autopromote.php
includes/BacklinkCache.php
includes/Block.php
includes/Category.php
includes/CategoryViewer.php
includes/Cdb_PHP.php
includes/ChangeTags.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/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/Hooks.php
includes/Html.php
includes/HttpFunctions.php
includes/ImagePage.php
includes/Import.php
includes/LinkFilter.php
includes/Linker.php
includes/LinksUpdate.php
includes/LocalisationCache.php
includes/Message.php
includes/MessageBlobStore.php
includes/Namespace.php
includes/OutputHandler.php
includes/OutputPage.php
includes/PHPVersionError.php
includes/Preferences.php
includes/ProtectionForm.php
includes/QueryPage.php
includes/Revision.php
includes/Sanitizer.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/Wiki.php
includes/WikiFilePage.php
includes/WikiPage.php
includes/Xml.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/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/ApiMain.php
includes/api/ApiOpenSearch.php
includes/api/ApiParse.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryORM.php [new file with mode: 0644]
includes/api/ApiQueryRevisions.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/cache/FileCacheBase.php
includes/cache/HTMLFileCache.php
includes/cache/LinkCache.php
includes/cache/MessageCache.php
includes/cache/SquidUpdate.php
includes/conf/Conf.php
includes/conf/DatabaseConf.php
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/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/IORMTable.php
includes/db/LBFactory_Multi.php
includes/db/LoadBalancer.php
includes/db/ORMTable.php
includes/diff/DifferenceEngine.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/TempFSFile.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filebackend/filejournal/FileJournal.php
includes/filebackend/lockmanager/MemcLockManager.php
includes/filerepo/FileRepo.php
includes/filerepo/README
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/LocalFile.php
includes/installer/DatabaseUpdater.php
includes/installer/Ibm_db2Updater.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/SqliteUpdater.php
includes/job/DoubleRedirectJob.php
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/RefreshLinksJob.php
includes/logging/LogEntry.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/media/Bitmap.php
includes/media/BitmapMetadataHandler.php
includes/media/Exif.php
includes/media/FormatMetadata.php
includes/media/GIFMetadataExtractor.php
includes/media/JpegMetadataExtractor.php
includes/media/MediaTransformOutput.php
includes/media/SVG.php
includes/media/SVGMetadataExtractor.php
includes/media/Tiff.php
includes/media/XMP.php
includes/objectcache/EhcacheBagOStuff.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/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/search/SearchEngine.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/SpecialBlockList.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialComparePages.php
includes/specials/SpecialContributions.php
includes/specials/SpecialExport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUnblock.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/SpecialWantedfiles.php
includes/specials/SpecialWantedpages.php
includes/upload/UploadFromChunks.php
includes/upload/UploadFromFile.php
includes/upload/UploadStash.php
languages/Language.php
languages/LanguageConverter.php
languages/classes/LanguageFi.php
languages/classes/LanguageGan.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/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/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/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/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/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/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/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_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/MessagesSdc.php
languages/messages/MessagesSe.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/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/MessagesZu.php
languages/utils/CLDRPluralRuleEvaluator.php
maintenance/Maintenance.php
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-fa_sha1.sql [new file with mode: 0644]
maintenance/archives/patch-img_sha1.sql
maintenance/archives/patch-job_token.sql [new file with mode: 0644]
maintenance/archives/patch-page-page_content_model.sql [new file with mode: 0644]
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-sites.sql [new file with mode: 0644]
maintenance/backupTextPass.inc
maintenance/checkBadRedirects.php
maintenance/cleanupSpam.php
maintenance/compareParsers.php
maintenance/cssjanus/cssjanus.py [changed mode: 0755->0644]
maintenance/cssjanus/csslex.py [changed mode: 0755->0644]
maintenance/deleteArchivedFiles.inc
maintenance/dumpIterator.php
maintenance/edit.php
maintenance/eval.php
maintenance/findHooks.php
maintenance/getText.php
maintenance/hiphop/make [changed mode: 0755->0644]
maintenance/hiphop/run-server [changed mode: 0755->0644]
maintenance/importSiteScripts.php
maintenance/importTextFile.php
maintenance/install.php
maintenance/language/checkLanguage.inc
maintenance/language/messages.inc
maintenance/locking/LockServerDaemon.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-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/tables.sql
maintenance/populateFilearchiveSha1.php [new file with mode: 0644]
maintenance/populateRevisionLength.php
maintenance/populateRevisionSha1.php
maintenance/postgres/tables.sql
maintenance/preprocessDump.php
maintenance/protect.php
maintenance/rebuildrecentchanges.php
maintenance/refreshLinks.php
maintenance/renderDump.php
maintenance/runJobs.php
maintenance/sqlite.inc
maintenance/sqlite/archives/patch-job_token.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-sites.sql [new file with mode: 0644]
maintenance/storage/drop_content_model_info.sql [new file with mode: 0644]
maintenance/storage/make-blobs [changed mode: 0755->0644]
maintenance/storage/testCompression.php
maintenance/syncFileBackend.php
maintenance/tables.sql
maintenance/term/MWTerm.php
maintenance/update.php
mw-config/index.php
mw-config/index.php5
mw-config/overrides.php
opensearch_desc.php5
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.byteLimit.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.suggestions.css
resources/jquery/jquery.suggestions.js
resources/jquery/jquery.tablesorter.js
resources/mediawiki/mediawiki.feedback.js
resources/mediawiki/mediawiki.hidpi.js [new file with mode: 0644]
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.searchSuggest.js [new file with mode: 0644]
serialized/serialize.php
skins/CologneBlue.php
skins/cologneblue/screen.css
skins/common/images/icons/fileicon-psd.png [new file with mode: 0644]
skins/common/mwsuggest.js [deleted file]
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/phpunit/MediaWikiLangTestCase.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/ArticleTablesTest.php
tests/phpunit/includes/ArticleTest.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/CdbTest.php
tests/phpunit/includes/ContentHandlerTest.php [new file with mode: 0644]
tests/phpunit/includes/CssContentTest.php [new file with mode: 0644]
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/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.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/JavascriptContentTest.php [new file with mode: 0644]
tests/phpunit/includes/JsonTest.php
tests/phpunit/includes/LanguageConverterTest.php
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/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/TextContentTest.php [new file with mode: 0644]
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/WikitextContentHandlerTest.php [new file with mode: 0644]
tests/phpunit/includes/WikitextContentTest.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/ApiPurgeTest.php
tests/phpunit/includes/api/ApiQueryTest.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/db/DatabaseSQLTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/db/TestORMRowTest.php
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/filerepo/FileBackendTest.php
tests/phpunit/includes/filerepo/StoreBatchTest.php
tests/phpunit/includes/libs/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
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/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/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/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/suites/resources/jquery/jquery.byteLimit.test.js
tests/qunit/suites/resources/jquery/jquery.hidpi.test.js [new file with mode: 0644]
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/testHelpers.inc
thumb.php
thumb.php5

index 0be75c5..319f196 100644 (file)
@@ -17,6 +17,7 @@ cache
 images/[0-9a-f]
 images/archive
 images/deleted
+images/lockdir
 images/temp
 images/thumb
 ## Extension:EasyTimeline
index 3e68abd..52c4e86 100644 (file)
@@ -67,7 +67,7 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (bug 35685) api.php URL and other entry point URLs are now listed on
   Special:Version
 * Edit notices can now be translated.
-* jQuery upgraded to 1.8.1
+* 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.
@@ -149,6 +149,8 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (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.
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
@@ -245,10 +247,21 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (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.
 
 === API changes in 1.20 ===
 * (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
@@ -285,8 +298,8 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (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 39665) List of query generators is now not built using reflection, instead it is
+  defined in code.
 
 === Languages updated in 1.20 ===
 
@@ -323,6 +336,14 @@ changes to languages because of Bugzilla reports.
 * 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().
 
 == Compatibility ==
 
index 63be7ba..8eb6a76 100644 (file)
@@ -1,7 +1,7 @@
 = 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.
+Security reminder: MediaWiki does not require PHP's register_globals. If you
+have it on, turn it '''off''' if you can.
 
 == MediaWiki 1.21 ==
 
@@ -12,32 +12,60 @@ 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 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 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 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 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.
 
 === 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
 
 === 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.
-
 === Other changes in 1.21 ===
-* Live preview functionality has been improved and moved into the
- 'mediawiki.action.edit.preview' module. The old 'mediawiki.legacy.preview' module
-  has been removed.
 
 == Compatibility ==
 
-MediaWiki 1.21 requires PHP 5.3.2. PHP 4 is no longer supported.
+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
@@ -53,7 +81,9 @@ The supported versions are:
 == Upgrading ==
 
 1.21 has several database changes since 1.20, and will not work without schema
-updates.
+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
old mode 100755 (executable)
new mode 100644 (file)
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..a18c608
--- /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 96757cd..46ddcfe 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
@@ -429,9 +434,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
@@ -458,6 +468,8 @@ $article: 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
@@ -479,7 +491,7 @@ 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
+'ArticleInsertComplete': After a new article is created. DEPRECATED, use PageContentInsertComplete
 $article: WikiPage created
 $user: User creating the article
 $text: New content
@@ -487,7 +499,7 @@ $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::doEdit()
+$flags: Flags passed to WikiPage::doEditContent()
 $revision: New Revision of the article
 
 'ArticleMergeComplete': after merging to article using Special:Mergehistory
@@ -538,7 +550,7 @@ $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
+'ArticleSave': before an article is saved. DEPRECATED, use PageContentSave instead
 $article: the WikiPage (object) being saved
 $user: the user (object) saving the article
 $text: the new article text
@@ -547,7 +559,7 @@ $isminor: minor flag
 $iswatch: watch flag
 $section: section #
 
-'ArticleSaveComplete': After an article has been updated
+'ArticleSaveComplete': After an article has been updated. DEPRECATED, use PageContentSaveComplete instead.
 $article: WikiPage modified
 $user: User performing the modification
 $text: New content
@@ -555,9 +567,9 @@ $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::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
@@ -586,11 +598,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 +742,16 @@ 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
+cointent 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.
+
 'ContribsPager::getQueryInfo': Before the contributions query is about to run
 &$pager: Pager object for contributions
 &$queryInfo: The query for the contribs Pager
@@ -795,12 +825,19 @@ $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 +848,7 @@ pages
 $editPage: EditPage    object
 
 'EditPage::attemptSave': called before an article is
-saved, that is before WikiPage::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
@@ -863,14 +900,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 +1190,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
@@ -1477,12 +1532,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
+$article: 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.
+$article: 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
+$article: 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
 
@@ -1730,7 +1818,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
@@ -2349,6 +2438,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 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 76e566b..0eb0c68 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;
        }
@@ -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->getRedirectChain();
                                                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,9 @@ class Article extends Page {
                                        # Run the parse, protected by a pool counter
                                        wfDebug( __METHOD__ . ": doing uncached parse\n" );
 
+                                       // @todo: shouldn't we be passing $this->getPage() to PoolWorkArticleView instead of plain $this?
                                        $poolArticleView = new PoolWorkArticleView( $this, $parserOptions,
-                                               $this->getRevIdFetched(), $useParserCache, $this->getContent() );
+                                               $this->getRevIdFetched(), $useParserCache, $this->getContentObject(), $this->getContext() );
 
                                        if ( !$poolArticleView->execute() ) {
                                                $error = $poolArticleView->getError();
@@ -708,6 +788,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 +801,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 +828,24 @@ 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' );
+
+               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' );
+               }
 
                // 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 ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
+                       $po = $this->mContentObject->getParserOutput( $this->getTitle() );
+                       $outputPage->addHTML( $po->getText() );
                }
        }
 
@@ -1377,7 +1470,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 +1716,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 +1727,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
@@ -1845,7 +1961,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()
+               );
        }
 
        /**
@@ -1892,7 +2014,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 ) ****** //
@@ -1930,6 +2054,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..1cf6634 100644 (file)
@@ -246,6 +246,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',
@@ -253,6 +254,7 @@ $wgAutoloadLocalClasses = array(
        'UnlistedSpecialPage' => 'includes/SpecialPage.php',
        'UploadSourceAdapter' => 'includes/Import.php',
        'UppercaseCollation' => 'includes/Collation.php',
+       'Uri' => 'includes/Uri.php',
        'User' => 'includes/User.php',
        'UserArray' => 'includes/UserArray.php',
        'UserArrayFromResult' => 'includes/UserArray.php',
@@ -288,6 +290,20 @@ $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',
+       '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 +346,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 +399,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',
@@ -447,7 +465,6 @@ $wgAutoloadLocalClasses = array(
        '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',
@@ -639,6 +656,9 @@ $wgAutoloadLocalClasses = array(
        'EmaillingJob' => 'includes/job/EmaillingJob.php',
        'EnotifNotifyJob' => 'includes/job/EnotifNotifyJob.php',
        'Job' => 'includes/job/Job.php',
+       'JobQueue' => 'includes/job/JobQueue.php',
+       'JobQueueDB' => 'includes/job/JobQueueDB.php',
+       'JobQueueGroup' => 'includes/job/JobQueueGroup.php',
        'RefreshLinksJob' => 'includes/job/RefreshLinksJob.php',
        'RefreshLinksJob2' => 'includes/job/RefreshLinksJob.php',
        'UploadFromUrlJob' => 'includes/job/UploadFromUrlJob.php',
@@ -858,6 +878,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',
@@ -1007,7 +1036,12 @@ $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
@@ -1021,6 +1055,7 @@ $wgAutoloadLocalClasses = array(
        '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',
@@ -1057,12 +1092,24 @@ $wgAutoloadLocalClasses = array(
        'TestFileIterator' => 'tests/testHelpers.inc',
        'TestRecorder' => 'tests/testHelpers.inc',
 
+       # tests/phpunit
+       'DummyContentHandlerForTesting' => 'tests/phpunit/includes/ContentHandlerTest.php',
+       'DummyContentForTesting' => 'tests/phpunit/includes/ContentHandlerTest.php',
+       'JavascriptContentTest' => 'tests/phpunit/includes/JavascriptContentTest.php',
+       'RevisionStorageTest' => 'tests/phpunit/includes/RevisionStorageTest.php',
+       'TextContentTest' => 'tests/phpunit/includes/TextContentTest.php',
+       'WikiPageTest' => 'tests/phpunit/includes/WikiPageTest.php',
+
        # tests/phpunit/includes
        'GenericArrayObjectTest' => 'tests/phpunit/includes/libs/GenericArrayObjectTest.php',
 
        # tests/phpunit/includes/db
        'ORMRowTest' => 'tests/phpunit/includes/db/ORMRowTest.php',
 
+       # tests/phpunit/includes/site
+       'SiteObjectTest' => 'tests/phpunit/includes/site/SiteObjectTest.php',
+       'TestSites' => 'tests/phpunit/includes/site/TestSites.php',
+
        # tests/parser
        'ParserTest' => 'tests/parser/parserTest.inc',
        'ParserTestParserHook' => 'tests/parser/parserTestsParserHook.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 ) {
index d2055dd..ba8691b 100644 (file)
@@ -217,6 +217,7 @@ class BacklinkCache {
        /**
         * Get the field name prefix for a given table
         * @param $table String
+        * @throws MWException
         * @return null|string
         */
        protected function getPrefix( $table ) {
@@ -245,6 +246,7 @@ class BacklinkCache {
         * 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 ) {
@@ -381,6 +383,7 @@ class BacklinkCache {
         * 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 ) {
index 732699d..86b4d13 100644 (file)
@@ -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() {
@@ -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 b7b12e8..ffd7bb8 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() {
index 3bb2bc9..3d66b74 100644 (file)
@@ -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 ) {
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 a97cb03..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 ) {
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..1b86f5d 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;
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..088bb7e 100644 (file)
@@ -76,6 +76,7 @@ abstract class DataUpdate implements DeferrableUpdate {
         *
         * @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 c2574dd..fdddfc9 100644 (file)
@@ -530,6 +530,13 @@ $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
@@ -738,6 +745,19 @@ $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(
+       CONTENT_MODEL_WIKITEXT => 'WikitextContentHandler', // the usual case
+       CONTENT_MODEL_JAVASCRIPT => 'JavaScriptContentHandler', // dumb version, no syntax highlighting
+       CONTENT_MODEL_CSS => 'CssContentHandler', // dumb version, no syntax highlighting
+       CONTENT_MODEL_TEXT => 'TextContentHandler', // plain text, for use by extensions etc
+);
+
 /**
  * Resizing can be done using PHP's internal image libraries or using
  * ImageMagick or another third-party converter, e.g. GraphicMagick.
@@ -1076,6 +1096,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
  * @{
@@ -1377,10 +1407,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;
 
@@ -1758,7 +1792,7 @@ $wgDBAhandler = 'db3';
 /**
  * Deprecated alias for $wgSessionsInObjectCache.
  *
- * @deprecated Use $wgSessionsInObjectCache
+ * @deprecated since 1.20; Use $wgSessionsInObjectCache
  */
 $wgSessionsInMemcached = false;
 
@@ -2031,6 +2065,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
@@ -2073,13 +2128,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;
@@ -2720,7 +2775,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
  */
@@ -3594,13 +3649,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();
 
@@ -4276,9 +4324,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
@@ -4694,17 +4754,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;
 
@@ -4713,14 +4767,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.
@@ -5385,6 +5431,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' ),
+);
+
 /**
  * Additional functions to be performed with updateSpecialPages.
  * Expensive Querypages are already updated.
@@ -5915,6 +5969,7 @@ $wgAPIModules = array();
 $wgAPIMetaModules = array();
 $wgAPIPropModules = array();
 $wgAPIListModules = array();
+$wgAPIGeneratorModules = array();
 
 /**
  * Maximum amount of rows to scan in a DB query in the API
@@ -6234,6 +6289,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
  *
@@ -6241,6 +6347,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 c138824..17335e4 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,14 +409,10 @@ 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();
@@ -442,6 +455,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;
@@ -454,10 +468,10 @@ 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 );
@@ -471,13 +485,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() ) ) );
@@ -572,12 +587,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.
@@ -590,15 +606,13 @@ 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
@@ -610,7 +624,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' );
@@ -717,10 +731,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',
@@ -753,7 +774,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' ) ) {
@@ -779,36 +806,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 = '' ) {
-               global $wgOut, $wgRequest, $wgParser;
+       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
+        */
+       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' );
@@ -824,15 +880,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 {
@@ -865,14 +922,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;
        }
 
        /**
@@ -883,47 +940,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;
        }
 
        /**
@@ -931,23 +1018,47 @@ 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 );
+
+               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->mPreloadText ) ) {
-                       return $this->mPreloadText;
+               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 '';
+                       return $handler->makeEmptyContent();
                }
 
                $page = WikiPage::factory( $title );
@@ -955,13 +1066,19 @@ class EditPage {
                        $title = $page->getRedirectTarget();
                        # Same as before
                        if ( $title === null || !$title->exists() || !$title->userCan( 'read' ) ) {
-                               return '';
+                               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 ) {
+                       return $handler->makeEmptyContent();
+               }
+
+               return $content->preloadTransform( $title, $parserOptions );
        }
 
        /**
@@ -981,6 +1098,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() {
@@ -1009,6 +1127,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'] : '';
@@ -1101,9 +1223,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 );
@@ -1245,13 +1377,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 );
@@ -1261,30 +1393,32 @@ class EditPage {
                                        // passed.
                                        if ( $this->summary === '' ) {
                                                $cleanSectionTitle = $wgParser->stripSectionName( $this->sectiontitle );
-                                               $this->summary = wfMessage( 'newsectionsummary' )
-                                                       ->rawParams( $cleanSectionTitle )->inContentLanguage()->text();
+                                               $this->summary = wfMessage( 'newsectionsummary', $cleanSectionTitle )
+                                                       ->inContentLanguage()->text() ;
                                        }
                                } 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 );
 
                                        // Create a link to the new section from the edit summary.
                                        $cleanSummary = $wgParser->stripSectionName( $this->summary );
-                                       $this->summary = wfMessage( 'newsectionsummary' )
-                                               ->rawParams( $cleanSummary )->inContentLanguage()->text();
+                                       $this->summary = wfMessage( 'newsectionsummary', $cleanSummary )
+                                               ->inContentLanguage()->text();
                                }
                        }
 
                        $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 ) {
@@ -1301,7 +1435,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;
@@ -1316,26 +1451,32 @@ 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( $textbox_content ) ) {
                                        // Successful merge! Maybe we should tell the user the good news?
                                        $this->isConflict = false;
+                                       $content = $textbox_content;
                                        wfDebug( __METHOD__ . ": Suppressing edit conflict, successful merge.\n" );
                                } else {
                                        $this->section = '';
-                                       $this->textbox1 = $text;
+                                       #$this->textbox1 = $text; #redundant, nothing to do here?
                                        wfDebug( __METHOD__ . ": Keeping edit conflict, failed merge.\n" );
                                }
                        }
@@ -1347,7 +1488,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;
@@ -1363,8 +1507,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;
@@ -1405,16 +1549,16 @@ class EditPage {
                                        // passed.
                                        if ( $this->summary === '' ) {
                                                $cleanSectionTitle = $wgParser->stripSectionName( $this->sectiontitle );
-                                               $this->summary = wfMessage( 'newsectionsummary' )
-                                                       ->rawParams( $cleanSectionTitle )->inContentLanguage()->text();
+                                               $this->summary = wfMessage( 'newsectionsummary', $cleanSectionTitle )
+                                                       ->inContentLanguage()->text();
                                        }
                                } elseif ( $this->summary !== '' ) {
                                        $sectionanchor = $wgParser->guessLegacySectionNameFromWikiText( $this->summary );
                                        # This is a new section, so create a link to the new section
                                        # in the revision summary.
                                        $cleanSummary = $wgParser->stripSectionName( $this->summary );
-                                       $this->summary = wfMessage( 'newsectionsummary' )
-                                               ->rawParams( $cleanSummary )->inContentLanguage()->text();
+                                       $this->summary = wfMessage( 'newsectionsummary', $cleanSummary )
+                                               ->inContentLanguage()->text();
                                }
                        } elseif ( $this->section != '' ) {
                                # Try to get a section anchor from the section source, redirect to edited section if header found
@@ -1434,14 +1578,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 );
@@ -1454,10 +1598,11 @@ 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;
+                               $result['redirect'] = $content->isRedirect();
                        $this->commitWatch();
                        wfProfileOut( __METHOD__ );
                        return $status;
@@ -1502,31 +1647,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 {
@@ -1597,7 +1770,7 @@ class EditPage {
                $wgOut->addModules( 'mediawiki.action.edit' );
 
                if ( $wgUser->getOption( 'uselivepreview', false ) ) {
-                       $wgOut->addModules( 'mediawiki.action.edit.preview' );
+                       $wgOut->addModules( 'mediawiki.legacy.preview' );
                }
                // Bug #19334: textarea jumps when editing articles in IE8
                $wgOut->addStyle( 'common/IE80Fixes.css', 'screen', 'IE 8' );
@@ -1696,10 +1869,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' )
+                               )
                        );
                }
        }
@@ -1717,17 +1893,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|false|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 ) {
@@ -1773,6 +2009,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' ) ) );
@@ -1837,6 +2075,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 ) );
@@ -1854,7 +2095,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 {
@@ -1880,7 +2123,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" );
@@ -1954,7 +2203,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 */ ";
                                        }
@@ -2020,13 +2269,10 @@ 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' ) );
-                                       }
                                }
                        }
                }
@@ -2157,16 +2403,14 @@ 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';
 
@@ -2185,9 +2429,8 @@ class EditPage {
 
 HTML
                );
-               if ( !$this->checkUnicodeCompliantBrowser() ) {
+               if ( !$this->checkUnicodeCompliantBrowser() )
                        $wgOut->addHTML( Html::hidden( 'safemode', '1' ) );
-               }
        }
 
        protected function showFormAfterText() {
@@ -2267,10 +2510,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.
@@ -2303,9 +2546,8 @@ HTML
 
                $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 ) );
 
@@ -2316,7 +2558,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>');
+                       }
                }
        }
 
@@ -2348,7 +2595,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
@@ -2356,24 +2603,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->getOriginalContent();
                }
-               $newtext = $this->mArticle->replaceSection(
-                       $this->section, $this->textbox1, $this->summary, $this->edittime );
 
-               wfRunHooks( 'EditPageGetDiffText', array( $this, &$newtext ) );
+               $textboxContent = $this->toEditContent( $this->textbox1 );
+
+               $newContent = $this->mArticle->replaceSectionContent(
+                                                       $this->section, $textboxContent,
+                                                       $this->summary, $this->edittime );
+
+               if ( $newContent ) {
+                       ContentHandler::runLegacyHooks( 'EditPageGetDiffText', array( $this, &$newContent ) );
+                       wfRunHooks( 'EditPageGetDiffContent', array( $this, &$newContent ) );
 
-               $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
-               $newtext = $wgParser->preSaveTransform( $newtext, $this->mTitle, $wgUser, $popts );
+                       $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
+                       $newContent = $newContent->preSaveTransform( $this->mTitle, $wgUser, $popts );
+               }
 
-               if ( $oldtext !== false  || $newtext != '' ) {
+               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 {
@@ -2490,8 +2756,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()
@@ -2582,23 +2852,21 @@ 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__ );
 
@@ -2617,82 +2885,94 @@ 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 !== '' );
+                       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>";
+                               } else {
+                                       $note = wfMessage( 'previewnote' )->text() ;
+                               }
+                       } else {
+                               $note = wfMessage( 'previewnote' )->text() ;
+                       }
 
-                       $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 ) {
@@ -3084,7 +3364,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 c2409de..e2b01b5 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 ) .
@@ -657,12 +657,6 @@ class XmlDumpWriter {
                        $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 ) {
                        $out .= "      " . Xml::element( 'text', array( 'deleted' => 'deleted' ) ) . "\n";
@@ -679,6 +673,34 @@ class XmlDumpWriter {
                                "" ) . "\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";
+               }
+
+               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 391829a..1b7c29d 100644 (file)
  */
 class ExternalStore {
        var $mParams;
-       
+
+       /**
+        * @param $params array
+        */
        function __construct( $params = array() ) {
                $this->mParams = $params;
        }
-       
+
        /**
         * Fetch data from given URL
         *
@@ -79,7 +82,7 @@ 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;
@@ -119,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
@@ -127,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;
@@ -165,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 7e616b2..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 ) {
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..3de25e7 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:' ) {
@@ -1719,6 +1721,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 +2515,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 ) {
@@ -3022,6 +3026,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 +3048,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;
@@ -3551,16 +3557,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 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..a07dd4c 100644 (file)
@@ -753,7 +753,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 +796,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 +812,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 +942,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..32f77dc 100644 (file)
@@ -265,6 +265,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 +394,7 @@ class MWHttpRequest {
         * will be aborted.
         *
         * @param $callback Callback
+        * @throws MWException
         */
        public function setCallback( $callback ) {
                if ( !is_callable( $callback ) ) {
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..71498ac 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
         */
@@ -1331,7 +1398,9 @@ class WikiRevision {
                # Insert the row
                $revision = new Revision( array(
                        '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 214f495..b19f6c4 100644 (file)
 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 );
        }
index 97b03be..bd5b571 100644 (file)
@@ -448,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;
@@ -675,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'],
@@ -795,6 +797,7 @@ class Linker {
                        $hp['width'] = isset( $fp['upright'] ) ? 130 : 180;
                }
                $thumb = false;
+               $noscale = false;
 
                if ( !$exists ) {
                        $outerWidth = $hp['width'] + 2;
@@ -813,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
@@ -846,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'],
@@ -872,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
         *
@@ -1075,8 +1113,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';
                                }
                        }
index 87db4d6..fd1fefb 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();
@@ -828,6 +830,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 +885,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..e88c240 100644 (file)
@@ -168,6 +168,7 @@ class LocalisationCache {
         * for $wgLocalisationCacheConf.
         *
         * @param $conf Array
+        * @throws MWException
         */
        function __construct( $conf ) {
                global $wgCacheDirectory;
@@ -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 9d09f00..824f177 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' );
 
@@ -618,6 +645,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 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 981637c..3578568 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 );
                }
@@ -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 ) {
@@ -1902,7 +1903,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 +1994,9 @@ class OutputPage extends ContextSource {
                wfRunHooks( 'AfterFinalPageOutput', array( $this ) );
 
                $this->sendCacheControl();
+
                ob_end_flush();
+
                wfProfileOut( __METHOD__ );
        }
 
@@ -2056,7 +2059,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 +2074,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 +2082,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 +2156,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 +2227,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' );
@@ -2459,7 +2462,7 @@ $templates
         */
        private function addDefaultModules() {
                global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax,
-                       $wgAjaxWatch, $wgEnableMWSuggest;
+                       $wgAjaxWatch, $wgResponsiveImages;
 
                // Add base resources
                $this->addModules( array(
@@ -2487,8 +2490,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' );
                        }
                }
 
@@ -2500,6 +2503,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' );
+               }
        }
 
        /**
@@ -2912,7 +2920,7 @@ $templates
         * @return array
         */
        public function getJSVars() {
-               global $wgUseAjax, $wgEnableMWSuggest, $wgContLang;
+               global $wgContLang;
 
                $latestRevID = 0;
                $pageID = 0;
@@ -2978,9 +2986,6 @@ $templates
                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;
                }
@@ -3568,7 +3573,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 eaf781b..65a0d02 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',
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 20cc8f5..984da69 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
+        */
+       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 );
        }
@@ -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,15 @@ 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( $row->ar_text ) && !$row->ar_text_id ) {
                        // Pre-1.5 ar_text row
                        $attribs['text'] = self::getRevisionText( $row, 'ar_' );
@@ -358,7 +385,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 +399,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 +472,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 +512,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 +545,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 +572,63 @@ 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, override mPage. Useful for testing and convenience.
+                       if ( isset( $row['title'] ) ) {
+                               $this->mTitle     = $row['title'];
+                               $this->mPage      = $this->mTitle->getArticleID();
+                       } else {
+                               $this->mTitle     = null; // Load on demand if needed
+                       }
+
+                       // @todo: XXX: really? we are about to create a revision. it will usually then be the current one.
                        $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 +701,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 +713,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 +900,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 +951,109 @@ 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
+        *
+        * @since 1.21
+        * @return Content
+        */
+       protected function getContentInternal() {
+               if( is_null( $this->mContent ) ) {
+                       // Revision is immutable. Load on demand:
+
+                       $handler = $this->getContentHandler();
+                       $format = $this->getContentFormat();
+
+                       if( is_null( $this->mText ) ) {
+                               // Load text on demand:
+                               $this->mText = $this->loadText();
+                       }
+
+                       $this->mContent = is_null( $this->mText ) ? null : $handler->unserializeContent( $this->mText, $format );
+               }
+
+               return $this->mContent->copy(); // NOTE: copy() will return $this for immutable content objects
+       }
+
+       /**
+        * 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 +1233,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 +1278,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 +1327,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->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
@@ -1159,12 +1457,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 +1479,7 @@ class Revision implements IDBAccessObject {
                        __METHOD__ );
 
                if( $current ) {
-                       $revision = new Revision( array(
+                       $row = array(
                                'page'       => $pageId,
                                'comment'    => $summary,
                                'minor_edit' => $minor,
@@ -1180,7 +1487,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 +1642,4 @@ class Revision implements IDBAccessObject {
                }
                return true;
        }
-}
\ No newline at end of file
+}
index 6358540..8919f10 100644 (file)
@@ -1183,6 +1183,7 @@ class Sanitizer {
         * attribs regex matches.
         *
         * @param $set Array
+        * @throws MWException
         * @return String
         */
        private static function getTagAttributeCallback( $set ) {
index 5c5d7d1..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';
index 968f215..24d48bc 100644 (file)
@@ -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 {
@@ -1536,6 +1536,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 54cc5a9..b8b1654 100644 (file)
@@ -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.
@@ -554,7 +566,7 @@ class SkinTemplate extends Skin {
                        }
                }
 
-               if ( $wgSecureLogin && $request->detectProtocol() == 'https' ) {
+               if ( $wgSecureLogin && $request->detectProtocol() === 'https' ) {
                        $a['wpStickHTTPS'] = true;
                }
 
@@ -1137,6 +1149,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;
@@ -1164,6 +1177,11 @@ class SkinTemplate extends Skin {
                                );
                        }
 
+                       $nav_urls['info'] = array(
+                               'text' => $this->msg( 'pageinfo-toolboxlink' )->text(),
+                               'href' => $out->getTitle()->getLocalURL( "action=info" )
+                       );
+
                        // Use the copy of revision ID in case this undocumented, shady hook tries to mess with internals
                        wfRunHooks( 'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink',
                                array( &$this, &$nav_urls, &$revid, &$revid ) );
@@ -1424,6 +1442,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;
index 2e5e02b..a72c1af 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 ) {
@@ -532,9 +521,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 +933,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();
index 95f75a8..8ed5264 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 );
 
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..147b0df 100644 (file)
@@ -225,6 +225,15 @@ class Status {
                }
        }
 
+       /**
+        * 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 );
+       }
+
        /**
         * Return an array with the wikitext for each item in the array.
         * @param $errors Array
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 1e16c75..ee3e01f 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
         *
@@ -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.
@@ -1402,7 +1501,7 @@ class Title {
         */
        public function getLinkURL( $query = '', $query2 = false, $proto = PROTO_RELATIVE ) {
                wfProfileIn( __METHOD__ );
-               if ( $this->isExternal() || $proto != PROTO_RELATIVE ) {
+               if ( $this->isExternal() || $proto !== PROTO_RELATIVE ) {
                        $ret = $this->getFullURL( $query, $query2, $proto );
                } elseif ( $this->getPrefixedText() === '' && $this->getFragment() !== '' ) {
                        $ret = $this->getFragmentForURL();
@@ -1642,15 +1741,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' );
@@ -1991,13 +2083,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 ) ) {
@@ -2827,8 +2919,16 @@ 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
+               }
+
+               $this->mRedirect = (bool)$cached;
 
                return $this->mRedirect;
        }
@@ -2849,7 +2949,14 @@ 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?
+                       throw new MWException( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
+               }
+
+               $this->mLength = intval( $cached );
 
                return $this->mLength;
        }
@@ -2869,7 +2976,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;
        }
@@ -2898,6 +3012,7 @@ class Title {
                $this->mRedirect = null;
                $this->mLength = -1;
                $this->mLatestID = false;
+               $this->mContentModel = false;
                $this->mEstimateRevisions = null;
        }
 
@@ -3136,7 +3251,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(),
@@ -3186,6 +3301,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
@@ -3202,9 +3319,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,
@@ -3336,7 +3456,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 ) {
@@ -3369,6 +3489,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 ) );
@@ -3595,7 +3724,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 );
@@ -3603,7 +3739,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 );
@@ -3638,7 +3774,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',
@@ -3665,18 +3802,16 @@ 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(
                                        'page'    => $newid,
                                        'comment' => $comment,
-                                       'text'    => $redirectText ) );
+                                       'content'    => $redirectContent ) );
                                $redirectRevision->insertOn( $dbw );
                                $redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
 
@@ -3772,10 +3907,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' )
@@ -3784,6 +3925,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;
                }
@@ -3828,24 +3970,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->getRedirectTarget();
+
+               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;
        }
 
        /**
@@ -4544,17 +4687,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;
+
+               //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 );
+
                // Hook at the end because we don't want to override the above stuff
                wfRunHooks( 'PageContentLanguage', array( $this, &$pageLang, $wgLang ) );
                return wfGetLangObj( $pageLang );
@@ -4569,19 +4708,23 @@ 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;
        }
 }
index 8216914..0a02dd2 100644 (file)
@@ -765,6 +765,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' ) {
@@ -816,39 +817,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();
        }
 
        /**
@@ -892,7 +870,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
@@ -1190,7 +1168,9 @@ class User {
        }
 
        /**
-        * 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.
@@ -1204,6 +1184,8 @@ class User {
                $this->mEffectiveGroups = null;
                $this->mImplicitGroups = null;
                $this->mOptions = null;
+               $this->mOptionsLoaded = false;
+               $this->mEditCount = null;
 
                if ( $reloadFrom ) {
                        $this->mLoadedItems = array();
@@ -1222,9 +1204,8 @@ class User {
 
                $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] );
                }
@@ -2465,7 +2446,32 @@ class User {
                if( $this->getId() ) {
                        if ( !isset( $this->mEditCount ) ) {
                                /* Populate the count, if it has not been populated yet */
-                               $this->mEditCount = User::edits( $this->mId );
+                               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.
+                                       $dbw = wfGetDB( DB_MASTER );
+                                       $count = $dbr->selectField(
+                                               'revision', 'count(*)',
+                                               array( 'rev_user' => $this->mId ),
+                                               __METHOD__
+                                       );
+                                       $dbw->update(
+                                               'user',
+                                               array( 'user_editcount' => $count ),
+                                               array( 'user_id' => $this->mId ),
+                                               __METHOD__
+                                       );
+                               }
+                               wfProfileOut( __METHOD__ );
+                               $this->mEditCount = $count;
                        }
                        return $this->mEditCount;
                } else {
@@ -3007,7 +3013,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();
@@ -3030,14 +3058,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();
        }
 
        /**
@@ -3639,14 +3684,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
         *
@@ -4064,12 +4122,28 @@ class User {
         * @todo document
         */
        protected function loadOptions() {
+               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" );
index 01e7132..9830f69 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 );
@@ -273,7 +274,7 @@ class UserMailer {
                        wfRestoreWarnings();
                        return Status::newGood();
                } else  {
-                       # 
+                       #
                        # PHP mail()
                        #
 
@@ -446,19 +447,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__ );
                        }
                }
 
index 2cc6338..7005416 100644 (file)
@@ -380,7 +380,6 @@ class WebRequest {
                return $ret;
        }
 
-       
        /**
         * Unset an arbitrary value from our get/post data.
         *
@@ -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() ) {
@@ -1056,9 +1057,10 @@ HTML;
        /**
         * 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 +1240,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 e1d84d4..7a6b37d 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 );
                        }
@@ -595,28 +597,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..bdec273 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->getSize();
+               $rt = $content->getUltimateRedirectTarget();
 
                $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,18 +1409,67 @@ 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 $content 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 ) {
+                               $oldContent = $this->getContent();
+                               if ( ! $oldContent ) {
                                        wfDebug( __METHOD__ . ": no page text\n" );
                                        wfProfileOut( __METHOD__ );
                                        return null;
@@ -1332,28 +1485,14 @@ 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 );
-                       }
+                       $newContent = $oldContent->replaceSection( $section, $sectionContent, $sectionTitle );
                }
 
                wfProfileOut( __METHOD__ );
-               return $text;
+               return $newContent;
        }
 
        /**
@@ -1419,8 +1558,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 +1627,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 +1644,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 +1665,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 +1700,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}." );
@@ -1497,20 +1710,35 @@ class WikiPage extends Page implements IDBAccessObject {
                                'page'       => $this->getId(),
                                '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();
+
+                                       wfProfileOut( __METHOD__ );
+                                       return $status;
+                               }
+
                                $revisionId = $revision->insertOn( $dbw );
 
                                # Update page
@@ -1558,8 +1786,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 +1808,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();
+
+                               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 );
@@ -1591,15 +1837,18 @@ class WikiPage extends Page implements IDBAccessObject {
                                'page'       => $newid,
                                '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
 
                        # Update the page record with revision data
                        $this->updateRevisionOn( $dbw, $revision, 0 );
@@ -1613,7 +1862,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 );
+                                       '', $content->getSize(), $revisionId, $patrolled );
 
                                # Log auto-patrolled edits
                                if ( $patrolled ) {
@@ -1626,8 +1875,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 +1890,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 +1906,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 +1918,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 ) {
+               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 $wgParser, $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,11 +1974,21 @@ 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->preSaveTransform( $this->mTitle, $user, $popts );
+               $edit->pst = $edit->pstContent->serialize( $serialization_format ); #XXX: do we need this??
+               $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->getParserOutput( $this->mTitle, $revid, $edit->popts );
+
+               $edit->newContent = $content;
+               $edit->oldContent = $this->getContent( Revision::RAW );
+
+               #NOTE: B/C for hooks! don't use these fields!
+               $edit->newText = ContentHandler::getContentText( $edit->newContent );
+               $edit->oldText = $edit->oldContent ? ContentHandler::getContentText( $edit->oldContent ) : '';
 
                $this->mPreparedEdit = $edit;
 
@@ -1720,7 +2001,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 +2017,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,7 +2036,7 @@ class WikiPage extends Page implements IDBAccessObject {
                }
 
                # Update the links tables and other secondary data
-               $updates = $editInfo->output->getSecondaryDataUpdates( $this->mTitle );
+               $updates = $content->getSecondaryDataUpdates( $this->getTitle(), null, true, $editInfo->output );
                DataUpdate::runUpdates( $updates );
 
                wfRunHooks( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
@@ -1801,7 +2081,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 +2108,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->getWikitextForTransclusion();
+                       if ( $msgtext === false || $msgtext === null ) $msgtext = '';
+
+                       MessageCache::singleton()->replace( $shortTitle, $msgtext );
                }
 
                if( $options['created'] ) {
@@ -1848,17 +2133,40 @@ 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(
                        '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 );
 
@@ -2152,7 +2460,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 +2501,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 +2516,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 +2559,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 +2575,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 +2584,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 +2605,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 +2777,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 +2928,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.
-
-               # Redirect autosummaries
-               $ot = Title::newFromRedirect( $oldtext );
-               $rt = Title::newFromRedirect( $newtext );
-
-               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();
-               }
+               # NOTE: stub for backwards-compatibility. assumes the given text is wikitext. will break horribly if it isn't.
 
-               # 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
+               ContentHandler::deprecated( __METHOD__, '1.21' );
 
-                       $truncatedtext = $wgContLang->truncate(
-                               $newtext,
-                               max( 0, 200 - strlen( wfMessage( 'autosumm-replace' )->inContentLanguage()->text() ) ) );
+               $handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
+               $oldContent = is_null( $oldtext ) ? null : $handler->unserializeContent( $oldtext );
+               $newContent = is_null( $newtext ) ? null : $handler->unserializeContent( $newtext );
 
-                       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 +2955,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 +3197,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 +3247,9 @@ class PoolWorkArticleView extends PoolCounterWork {
        private $parserOptions;
 
        /**
-        * @var string|null
+        * @var Content|null
         */
-       private $text;
+       private $content = null;
 
        /**
         * @var ParserOutput|bool
@@ -3056,14 +3273,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 +3322,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 +3419,4 @@ class PoolWorkArticleView extends PoolCounterWork {
                return false;
        }
 }
+
index 4a55d5e..2f8ba0f 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)
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..510f4ef 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,15 @@ 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 );
 
                // Search engine status
                $pOutput = new ParserOutput();
@@ -126,27 +242,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 +270,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 +339,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 +371,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 +388,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 +432,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 +480,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 +491,7 @@ class InfoAction extends FormlessAction {
                        $result['views'] = $views;
                }
 
-               if ( $canViewUnwatched ) {
+               if ( $user->isAllowed( 'unwatchedpages' ) ) {
                        // Number of page watchers
                        $watchers = (int) $dbr->selectField(
                                'watchlist',
@@ -454,41 +582,74 @@ 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()
+                       : '';
        }
 
        /**
@@ -499,13 +660,4 @@ class InfoAction extends FormlessAction {
        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 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..ca62bc6 100644 (file)
@@ -54,17 +54,37 @@ class ApiEditPage extends ApiBase {
                        $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
                }
 
+               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' );
+               }
+
                $apiResult = $this->getResult();
 
                if ( $params['redirect'] ) {
                        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();
@@ -103,31 +123,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 +201,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 +232,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' => ''
                );
@@ -196,7 +251,7 @@ class ApiEditPage extends ApiBase {
                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 +299,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 +322,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 +338,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 +392,15 @@ 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 );
                                        $r['newtimestamp'] = wfTimestamp( TS_ISO_8601,
-                                               $articleObj->getTimestamp() );
+                                               $pageObj->getTimestamp() );
                                }
                                break;
 
@@ -380,6 +444,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 +462,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 +532,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(),
+                       )
                );
        }
 
@@ -498,6 +576,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..31c90e1
--- /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 bfc4933..3aa51b7 100644 (file)
@@ -105,6 +105,7 @@ class ApiMain extends ApiBase {
                'dbgfm' => 'ApiFormatDbg',
                'dump' => 'ApiFormatDump',
                'dumpfm' => 'ApiFormatDump',
+               'none' => 'ApiFormatNone',
        );
 
        /**
@@ -821,6 +822,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 +840,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 +897,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, "', '" ) . "'" );
+               }
        }
 
        /**
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 2fcdc38..a29a0bd 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' );
                }
@@ -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, $popts );
                                }
                        } else { // Not $oldid, but $pageid or $page
                                if ( $params['redirects'] ) {
@@ -142,19 +153,15 @@ class ApiParse extends ApiBase {
                                        $oldid = $pageObj->getLatest();
                                }
 
+
                                $popts = $pageObj->makeParserOptions( $this->getContext() );
                                $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 ) );
@@ -165,27 +172,42 @@ class ApiParse extends ApiBase {
                        $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, $popts );
+                       } else {
+                               $p_result = $this->content->getParserOutput( $titleObj, $popts );
+                       }
                }
 
                $result_array = array();
@@ -275,10 +297,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 +308,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 +351,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() );
+                       $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(), $popts );
                } else {
                        // Try the parser cache first
                        // getParserOutput will save to Parser cache if able
@@ -342,20 +369,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 +578,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(),
+                       )
                );
        }
 
@@ -593,6 +629,8 @@ class ApiParse extends ApiBase {
                        'section' => 'Only retrieve the content of this section number',
                        'disablepp' => 'Disable the PP Report from the parser output',
                        'generatexml' => 'Generate XML parse tree',
+                       'contentformat' => 'Content serialization format used for the input text',
+                       'contentmodel' => 'Content model of the new content',
                );
        }
 
@@ -613,6 +651,8 @@ 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.' ),
                ) );
        }
 
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..dff7524 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
@@ -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 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',
diff --git a/includes/api/ApiQueryORM.php b/includes/api/ApiQueryORM.php
new file mode 100644 (file)
index 0000000..3b18d8a
--- /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
+ *
+ * @licence 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, handle the * value for the props param
+        * 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 41dfc33..881b797 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();
 
@@ -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,79 @@ 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();
+
+                               if ( !$content->isSupportedFormat( $format ) ) {
+                                       $model = $content->getModel();
+                                       $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 );
+                               $vals['contentformat'] = $format;
+                       }
+
+                       if ( $text !== false ) {
+                               ApiResult::setContent( $vals, $text );
                        }
-                       ApiResult::setContent( $vals, $text );
                } elseif ( $this->fld_content ) {
                        $vals['texthidden'] = '';
                }
@@ -524,11 +573,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 +632,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                        'userid',
                                        'size',
                                        'sha1',
+                                       'contentmodel',
                                        'comment',
                                        'parsedcomment',
                                        'content',
@@ -617,6 +682,10 @@ class ApiQueryRevisions extends ApiQueryBase {
                        'continue' => null,
                        'diffto' => null,
                        'difftotext' => null,
+                       'contentformat' => array(
+                               ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
+                               ApiBase::PARAM_DFLT => null
+                       ),
                );
        }
 
@@ -632,6 +701,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',
@@ -656,6 +726,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',
                );
        }
 
@@ -733,13 +804,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 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..6b8639c 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' ) {
@@ -196,7 +199,7 @@ class ApiUpload extends ApiBase {
                                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();
 
@@ -222,7 +225,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)
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 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..e061101 100644 (file)
@@ -596,7 +596,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 +607,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 ) {
@@ -770,16 +771,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 );
                }
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;
        }
-       
 }
index 93204ea..22c621f 100644 (file)
@@ -97,6 +97,7 @@ abstract class Conf {
         * Initialize a new child class based on a configuration array
         * @param $conf Array of configuration settings, see $wgConfiguration
         *   for details
+        * @throws MWException
         * @return Conf
         */
        private static function newFromSettings( $conf ) {
@@ -109,7 +110,8 @@ abstract class Conf {
 
        /**
         * Get the singleton if we don't want a specific wiki
-        * @param $wiki String An id for a remote wiki
+        * @param bool|string $wiki An id for a remote wiki
+        * @throws MWException
         * @return Conf child
         */
        public static function load( $wiki = false ) {
index e2e36ce..d8f644d 100644 (file)
@@ -39,7 +39,7 @@ class DatabaseConf extends Conf {
         *
         * @param $name
         * @param $value
-        * 
+        *
         * @return bool
         */
        protected function writeSetting( $name, $value ) {
diff --git a/includes/content/AbstractContent.php b/includes/content/AbstractContent.php
new file mode 100644 (file)
index 0000000..495711a
--- /dev/null
@@ -0,0 +1,414 @@
+<?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;
+       }
+}
diff --git a/includes/content/Content.php b/includes/content/Content.php
new file mode 100644 (file)
index 0000000..d830dc7
--- /dev/null
@@ -0,0 +1,490 @@
+<?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 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 Empty/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 $popts null|ParserOptions
+        * @return Content
+        */
+       public function preSaveTransform( Title $title, User $user, ParserOptions $popts );
+
+       /**
+        * 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 $popts null|ParserOptions
+        * @return Content
+        */
+       public function preloadTransform( Title $title, ParserOptions $popts );
+
+       /**
+        * 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 );
+
+       # 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..33c803e
--- /dev/null
@@ -0,0 +1,1108 @@
+<?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
+        *
+        * @static
+        * @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
+        *
+        * @static
+        *
+        * @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
+        *
+        * @static
+        * @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
+        *
+        * @static
+        * @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
+        *
+        * @static
+        * @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
+        *
+        * @static
+        * @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 ).
+        *
+        * @static
+        * @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
+        *
+        * @abstract
+        * @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
+        *
+        * @abstract
+        * @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
+       ) {
+               $this->checkModelID( $context->getTitle()->getContentModel() );
+
+               $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;
+
+               if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+                       // Parse mediawiki messages with correct target language
+                       list( /* $unused */, $lang ) = MessageCache::singleton()->figureMessage( $title->getText() );
+                       return wfGetLangObj( $lang );
+               }
+
+               return $wgContLang;
+       }
+
+       /**
+        * 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 ) {
+               global $wgContLang;
+
+               // 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;
+
+               $this->checkModelID( $content->getModel() );
+
+               // 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->getSize() == 0 ) {
+                       $prev = $rev->getPrevious();
+
+                       if ( $prev )    {
+                               $content = $prev->getContent();
+                               $blank = true;
+                       }
+               }
+
+               // 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->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..e2199c4
--- /dev/null
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * @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' );
+       }
+}
\ No newline at end of file
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..8b080bf
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+
+# 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 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' );
+       }
+}
\ No newline at end of file
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..8e832ec
--- /dev/null
@@ -0,0 +1,232 @@
+<?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 ( !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.
+        *
+        * @param   the raw text
+        */
+       public function getNativeData( ) {
+               $text = $this->mText;
+               return $text;
+       }
+
+       /**
+        * Returns the text represented by this Content object, as a string.
+        *
+        * @param   the raw text
+        */
+       public function getTextForSearchIndex( ) {
+               return $this->getNativeData();
+       }
+
+       /**
+        * Returns the text represented by this Content object, as a string.
+        *
+        * @param   the raw text
+        */
+       public function getWikitextForTransclusion( ) {
+               return $this->getNativeData();
+       }
+
+       /**
+        * 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() );
+       }
+}
diff --git a/includes/content/TextContentHandler.php b/includes/content/TextContentHandler.php
new file mode 100644 (file)
index 0000000..9dff67e
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * @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( '' );
+       }
+}
\ No newline at end of file
diff --git a/includes/content/WikitextContent.php b/includes/content/WikitextContent.php
new file mode 100644 (file)
index 0000000..8f1381f
--- /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 === '' ) {
+                       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.
+        * @param $title null|\Title
+        *
+        * @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 $content Content the content to render
+        * @param $title \Title
+        * @param $revId null
+        * @param $options null|ParserOptions
+        * @param $generateHtml bool
+        *
+        * @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..c6ac2ba
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @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;
+       }
+}
\ No newline at end of file
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..cd2bf55 100644 (file)
@@ -148,6 +148,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 +238,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 +307,7 @@ class RequestContext implements IContextSource {
        public function getSkin() {
                if ( $this->skin === null ) {
                        wfProfileIn( __METHOD__ . '-createskin' );
-                       
+
                        $skin = null;
                        wfRunHooks( 'RequestContextCreateSkin', array( $this, &$skin ) );
 
@@ -395,4 +397,3 @@ class RequestContext implements IContextSource {
        }
 
 }
-
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 9519e50..48aac9d 100644 (file)
@@ -228,7 +228,10 @@ abstract class DatabaseBase implements DatabaseType {
        protected $mConn = null;
        protected $mOpened = false;
 
-       /** @var Array */
+       /**
+        * @since 1.20
+        * @var array of callable
+        */
        protected $trxIdleCallbacks = array();
 
        protected $mTablePrefix;
@@ -263,6 +266,14 @@ 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;
+
 # ------------------------------------------------------------------------------
 # Accessors
 # ------------------------------------------------------------------------------
@@ -742,8 +753,14 @@ abstract class DatabaseBase implements DatabaseType {
                $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 +778,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 +828,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' ) );
@@ -866,6 +884,7 @@ abstract class DatabaseBase implements DatabaseType {
                                        wfDebug("Implicit transaction start.\n");
                                }
                                $this->begin( __METHOD__ . " ($fname)" );
+                               $this->mTrxAutomatic = true;
                        }
                }
 
@@ -900,6 +919,7 @@ abstract class DatabaseBase implements DatabaseType {
                if ( false === $ret && $this->wasErrorReissuable() ) {
                        # Transaction is gone, like it or not
                        $this->mTrxLevel = 0;
+                       $this->trxIdleCallbacks = array(); // cancel
                        wfDebug( "Connection lost, reconnecting...\n" );
 
                        if ( $this->ping() ) {
@@ -939,6 +959,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 +1046,7 @@ abstract class DatabaseBase implements DatabaseType {
         * while we're doing this.
         *
         * @param $matches Array
+        * @throws DBUnexpectedError
         * @return String
         */
        protected function fillPreparedArg( $matches ) {
@@ -1740,7 +1762,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 +1770,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 ) {
@@ -2449,6 +2472,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 +2538,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 +2637,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,8 +2886,9 @@ 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 ) {
@@ -2872,7 +2899,9 @@ abstract class DatabaseBase implements DatabaseType {
        }
 
        /**
-        * Actually run the "on transaction idle" callbacks
+        * Actually run the "on transaction idle" callbacks.
+        *
+        * @since 1.20
         */
        protected function runOnTransactionIdleCallbacks() {
                $e = null; // last exception
@@ -2898,8 +2927,8 @@ abstract class DatabaseBase implements DatabaseType {
         * 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 warnings if DBO_TRX is not set
-        * or the extsting transaction contained write operations.
+        * 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
         */
@@ -2907,21 +2936,18 @@ abstract class DatabaseBase implements DatabaseType {
                global $wgDebugDBTransactions;
 
                if ( $this->mTrxLevel ) { // implicit commit
-                       if ( $this->mTrxDoneWrites || ( $this->mFlags & DBO_TRX ) === 0 ) {
-                               // In theory, we should always warn about nesting BEGIN statements.
-                               // However, it is sometimes hard to avoid so we only warn if:
-                               //
-                               // a) the transaction has done writes. 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.
-                               //
-                               // b) the DBO_TRX flag is not set. Explicit transactions should always be properly
-                               //    started and comitted.
+                       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 ( $wgDebugDBTransactions ) {
-                                       wfDebug( "$fname: Transaction already in progress (from {$this->mTrxFname}), " .
+                               // 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" );
                                }
                        }
@@ -2933,6 +2959,7 @@ abstract class DatabaseBase implements DatabaseType {
                $this->doBegin( $fname );
                $this->mTrxFname = $fname;
                $this->mTrxDoneWrites = false;
+               $this->mTrxAutomatic = false;
        }
 
        /**
@@ -2953,11 +2980,26 @@ abstract class DatabaseBase implements DatabaseType {
         * 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();
        }
@@ -3016,6 +3058,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,
@@ -3030,6 +3073,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' );
@@ -3173,10 +3217,11 @@ 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
+        * @throws MWException
         * @return bool|string
         */
        public function sourceFile(
index f1f6dfc..62c90d1 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,6 +1179,10 @@ class DatabaseIbm_db2 extends DatabaseBase {
         * DELETE query wrapper
         *
         * Use $conds == "*" to delete all rows
+        * @param array $table
+        * @param array|string $conds
+        * @param string $fname
+        * @throws DBUnexpectedError
         * @return bool|\ResultWrapper
         */
        public function delete( $table, $conds, $fname = 'DatabaseIbm_db2::delete' ) {
@@ -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..ff67f47 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,6 +520,14 @@ 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.
+        * @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',
@@ -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..b509302 100644 (file)
@@ -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..1125d4f 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 ) {
index 99413f9..9693789 100644 (file)
@@ -298,6 +298,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 195d4ec..46d24fc 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 ) {
@@ -520,6 +523,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');
@@ -692,6 +696,7 @@ class LoadBalancer {
         *
         * @param $server
         * @param $dbNameOverride bool
+        * @throws MWException
         * @return DatabaseBase
         */
        function reallyOpenConnection( $server, $dbNameOverride = false ) {
@@ -902,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' );
+                                       }
                                }
                        }
                }
@@ -920,7 +927,7 @@ class LoadBalancer {
                        }
                        foreach ( $conns2[$masterIndex] as $conn ) {
                                if ( $conn->trxLevel() && $conn->doneWrites() ) {
-                                       $conn->commit( __METHOD__ );
+                                       $conn->commit( __METHOD__, 'flush' );
                                }
                        }
                }
index a77074f..e3a3434 100644 (file)
@@ -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
@@ -55,6 +55,15 @@ abstract class ORMTable implements IORMTable {
         */
        protected $readDb = DB_SLAVE;
 
+       /**
+        * The ID of any foreign wiki to use as a target for database operations,
+        * or false to use the local wiki.
+        *
+        * @since 1.20
+        * @var String|bool
+        */
+       protected $wiki = false;
+
        /**
         * Returns a list of default field values.
         * field name => field value
@@ -145,13 +154,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 +254,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;
        }
 
        /**
@@ -327,13 +343,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 +418,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 +429,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 +439,86 @@ 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->getLoadBalancer()->getConnection( $this->getReadDb(), array(), $this->getTargetWiki() );
+       }
+
+       /**
+        * 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->getLoadBalancer()->getConnection( DB_MASTER, array(), $this->getTargetWiki() );
+       }
+
+       /**
+        * Get the database type used for read operations.
+        *
+        * @see wfGetLB
+        *
+        * @since 1.20
+        *
+        * @return LoadBalancer The database load balancer object
+        */
+       public function getLoadBalancer() {
+               return wfGetLB( $this->getTargetWiki() );
+       }
+
+       /**
+        * 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 ) {
+               if ( $this->wiki !== false ) {
+                       // recycle connection to foreign wiki
+                       $this->getLoadBalancer()->reuseConnection( $db );
+               }
+       }
+
        /**
         * Update the records matching the provided conditions by
         * setting the fields that are keys in the $values param to
@@ -431,14 +532,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 +554,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 +566,7 @@ abstract class ORMTable implements IORMTable {
                        $item->save();
                }
 
-               $this->setReadDb( DB_SLAVE );
+               $this->setReadDb( $slave );
        }
 
        /**
index c7156fb..f3dc5a3 100644 (file)
@@ -38,7 +38,7 @@ class DifferenceEngine extends ContextSource {
         * @private
         */
        var $mOldid, $mNewid;
-       var $mOldtext, $mNewtext;
+       var $mOldContent, $mNewContent;
        protected $mDiffLang;
 
        /**
@@ -224,6 +224,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.
@@ -510,19 +514,21 @@ 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
+                                       $po = $this->mNewRev->getContent()->getParserOutput( $this->mNewRev->getTitle(), $this->mNewRev->getId() );
+                                       $out->addHTML( $po->getText() );
                                }
-                       } 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 +542,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->getRedirectTarget();
 
-                               $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 +567,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
@@ -652,7 +674,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 +711,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 +930,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 +1022,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 +1168,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 === false ) {
                                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 === false ) {
                                return false;
                        }
                }
@@ -1110,7 +1196,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 9349534..dd43f82 100644 (file)
@@ -644,7 +644,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 +662,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 e88c368..0ef4cd0 100644 (file)
@@ -584,8 +584,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 );
@@ -731,7 +732,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.
@@ -818,7 +841,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.
@@ -831,7 +876,29 @@ 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 );
 
        /**
         * Check if a directory exists at a given storage path.
@@ -1006,6 +1073,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
         *
@@ -1110,6 +1188,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..90292ee 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,35 @@ 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] );
-               return $this->backends[$this->masterIndex]->getLocalCopy( $realParams );
+               $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;
        }
 
        /**
index 5823326..5f562d2 100644 (file)
@@ -314,31 +314,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 );
@@ -636,24 +646,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;
        }
 
        /**
@@ -720,37 +739,76 @@ 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::streamFile()
         * @return Status
@@ -776,6 +834,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'] );
                }
@@ -949,6 +1015,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)
@@ -1118,6 +1185,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 ) {
@@ -1415,6 +1484,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 +1541,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,6 +1557,10 @@ 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 );
        }
 
@@ -1497,6 +1571,10 @@ abstract class FileBackendStore extends FileBackend {
         * @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 +1583,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 +1600,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 185a557..25c14f5 100644 (file)
@@ -806,27 +806,77 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        /**
-        * @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 +1084,76 @@ 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;
        }
 
        /**
@@ -1262,13 +1344,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..34f3e53 100644 (file)
@@ -83,6 +83,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..3bc0df7 100644 (file)
@@ -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 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 5f24fed..e8aa5a6 100644 (file)
@@ -1318,6 +1318,7 @@ class FileRepo {
         * e.g. s/z/a/ for sza251lrxrc1jad41h5mgilp8nysje52.jpg
         *
         * @param $key string
+        * @throws MWException
         * @return string
         */
        public function getDeletedHashPath( $key ) {
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..694623b 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() {
@@ -152,7 +155,8 @@ class ArchivedFile {
                                        'fa_user',
                                        'fa_user_text',
                                        'fa_timestamp',
-                                       'fa_deleted' ),
+                                       'fa_deleted',
+                                       'fa_sha1' ),
                                $conds,
                                __METHOD__,
                                array( 'ORDER BY' => 'fa_timestamp DESC' ) );
@@ -164,23 +168,7 @@ class ArchivedFile {
                        $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.' );
                }
@@ -199,28 +187,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 +382,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 bbabe84..caa93a4 100644 (file)
@@ -1186,8 +1186,9 @@ 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();
@@ -1475,9 +1476,9 @@ class LocalFile extends File {
                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();
        }
 
@@ -1773,7 +1774,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 +1807,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 +2040,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 ff0a99e..7223003 100644 (file)
@@ -54,12 +54,17 @@ 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',
        );
 
        /**
@@ -177,7 +182,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 +259,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
index f7d5a1e..805ff0f 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'),
@@ -89,6 +89,11 @@ class Ibm_db2Updater extends DatabaseUpdater {
                        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 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 98e1386..82de913 100644 (file)
@@ -216,8 +216,16 @@ class MysqlUpdater extends DatabaseUpdater {
                        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' ),
                );
        }
 
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 d81cf06..f946d59 100644 (file)
@@ -70,8 +70,16 @@ class OracleUpdater extends DatabaseUpdater {
                        array( 'addTable', 'config', 'patch-config.sql' ),
                        array( 'addIndex', 'ipblocks', 'i05', 'patch-ipblocks_i05_index.sql' ),
                        array( 'addIndex', 'revision', 'i05', 'patch-revision_i05_index.sql' ),
-
-                       // 1.21
+                       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..9ad91b7 100644 (file)
@@ -101,6 +101,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'"),
@@ -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 ''" ),
index 95a61c1..c3f7a81 100644 (file)
@@ -95,8 +95,17 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'dropField', 'category',     'cat_hidden',       'patch-cat_hidden.sql' ),
 
                        // 1.21
-                       array( 'dropField', 'site_stats',   'ss_admins',        'patch-drop-ss_admins.sql' ),
+                       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' ),
                );
        }
 
index f9c4b0f..b1b96b6 100644 (file)
@@ -93,8 +93,8 @@ class DoubleRedirectJob extends Job {
                        wfDebug( __METHOD__.": target redirect already deleted, ignoring\n" );
                        return true;
                }
-               $text = $targetRev->getText();
-               $currentDest = Title::newFromRedirect( $text );
+               $content = $targetRev->getContent();
+               $currentDest = $content->getRedirectTarget();
                if ( !$currentDest || !$currentDest->equals( $this->redirTitle ) ) {
                        wfDebug( __METHOD__.": Redirect has changed since the job was queued\n" );
                        return true;
@@ -102,7 +102,7 @@ class DoubleRedirectJob extends Job {
 
                # Check for a suppression tag (used e.g. in periodically archived discussions)
                $mw = MagicWord::get( 'staticredirect' );
-               if ( $mw->match( $text ) ) {
+               if ( $content->matchMagicWord( $mw ) ) {
                        wfDebug( __METHOD__.": skipping: suppressed with __STATICREDIRECT__\n" );
                        return true;
                }
@@ -124,14 +124,10 @@ class DoubleRedirectJob extends Job {
                        $currentDest->getFragment(), $newTitle->getInterwiki() );
 
                # 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???' );
+               $newContent = $content->updateRedirect( $newTitle );
+
+               if ( $newContent->equals( $content ) ) {
+                       $this->setLastError( 'Content unchanged???' );
                        return false;
                }
 
@@ -143,7 +139,7 @@ class DoubleRedirectJob extends Job {
                $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() );
+               $article->doEditContent( $newContent, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC, false, $this->getUser() );
                $wgUser = $oldUser;
 
                return true;
index b47acc4..0d2803e 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,172 +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->begin( __METHOD__ );
-               $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-               $affected = $dbw->affectedRows();
-               $dbw->commit( __METHOD__ );
-
-               if ( !$affected ) {
-                       $dbw->begin( __METHOD__ );
-
-                       // 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
-                               $dbw->rollback( __METHOD__ );
-                               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
-                               $dbw->rollback( __METHOD__ );
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-                       // Delete the random row
-                       $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-                       $affected = $dbw->affectedRows();
-                       $dbw->commit( __METHOD__ );
-
-                       if ( !$affected ) {
-                               // Random job gone before we exclusively deleted it
-                               // Give up
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-               }
-
-               // If execution got to here, there's a row in $row that has been deleted from the database
-               // by this thread. Hence the concurrent pop was successful.
-               wfIncrStats( 'job-pop' );
-               $namespace = $row->job_namespace;
-               $dbkey = $row->job_title;
-               $title = Title::makeTitleSafe( $namespace, $dbkey );
-
-               if ( is_null( $title ) ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ), $row->job_id );
-
-               // Remove any duplicates it may have later in the queue
-               $job->removeDuplicates();
-
-               wfProfileOut( __METHOD__ );
-               return $job;
-       }
-
        /**
         * Create the appropriate object to handle a specific job
         *
@@ -223,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];
@@ -232,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.
@@ -264,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 );
        }
 
        /**
@@ -301,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();
        }
 
        /*-------------------------------------------------------------------------
@@ -352,76 +134,63 @@ 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
         */
-       function insert() {
-               $fields = $this->insertFields();
+       public function getId() {
+               return $this->id;
+       }
 
-               $dbw = wfGetDB( DB_MASTER );
+       /**
+        * @return string
+        */
+       public function getType() {
+               return $this->command;
+       }
 
-               if ( $this->removeDuplicates ) {
-                       $res = $dbw->select( 'job', array( '1' ), $fields, __METHOD__ );
-                       if ( $dbw->numRows( $res ) ) {
-                               return true;
-                       }
-               }
-               wfIncrStats( 'job-insert' );
-               return $dbw->insert( 'job', $fields, __METHOD__ );
+       /**
+        * @return Title
+        */
+       public function getTitle() {
+               return $this->title;
        }
 
        /**
         * @return array
         */
-       protected function insertFields() {
-               $dbw = wfGetDB( DB_MASTER );
-               return array(
-                       'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
-                       'job_cmd' => $this->command,
-                       'job_namespace' => $this->title->getNamespace(),
-                       'job_title' => $this->title->getDBkey(),
-                       'job_timestamp' => $dbw->timestamp(),
-                       'job_params' => Job::makeBlob( $this->params )
-               );
+       public function getParams() {
+               return $this->params;
        }
 
        /**
-        * Remove jobs in the job queue which are duplicates of this job.
-        * This is deadlock-prone and so starts its own transaction.
+        * @return bool
         */
-       function removeDuplicates() {
-               if ( !$this->removeDuplicates ) {
-                       return;
-               }
+       public function ignoreDuplicates() {
+               return $this->removeDuplicates;
+       }
 
-               $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 ) {
@@ -447,7 +216,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..6409cff
--- /dev/null
@@ -0,0 +1,185 @@
+<?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.20
+ */
+abstract class JobQueue {
+       protected $wiki; // string; wiki ID
+       protected $type; // string; job type
+
+       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'];
+       }
+
+       /**
+        * 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
+        *
+        * @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;
+       }
+
+       /**
+        * @return bool Quickly check if the queue is empty
+        */
+       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 );
+
+       /**
+        * 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..bea4a6f
--- /dev/null
@@ -0,0 +1,318 @@
+<?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.20
+ */
+class JobQueueDB extends JobQueue {
+       const CACHE_TTL      = 30; // integer; seconds
+       const MAX_JOB_RANDOM = 2147483647; // 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();
+
+                       $rows = array();
+                       foreach ( $jobs as $job ) {
+                               $rows[] = $this->insertFields( $job );
+                       }
+                       $atomic = ( $flags & self::QoS_Atomic );
+                       $key    = $this->getEmptinessCacheKey();
+                       $ttl    = self::CACHE_TTL;
+
+                       $dbw->onTransactionIdle( function() use ( $dbw, $rows, $atomic, $key, $ttl ) {
+                               global $wgMemc;
+
+                               $autoTrx = $dbw->getFlag( DBO_TRX ); // automatic begin() enabled?
+                               if ( $atomic ) {
+                                       $dbw->begin(); // wrap all the job additions in one transaction
+                               } else {
+                                       $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+                               }
+                               try {
+                                       foreach ( array_chunk( $rows, 50 ) as $rowBatch ) { // avoid slave lag
+                                               $dbw->insert( 'job', $rowBatch, __METHOD__ );
+                                       }
+                               } catch ( DBError $e ) {
+                                       if ( $atomic ) {
+                                               $dbw->rollback();
+                                       } else {
+                                               $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+                                       }
+                                       throw $e;
+                               }
+                               if ( $atomic ) {
+                                       $dbw->commit();
+                               } else {
+                                       $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+                               }
+
+                               $wgMemc->set( $key, 'false', $ttl );
+                       } );
+               }
+
+               return true;
+       }
+
+       /**
+        * @see JobQueue::doPop()
+        * @return Job|bool
+        */
+       protected function doPop() {
+               global $wgMemc;
+
+               $uuid = wfRandomString( 32 ); // pop attempt
+
+               $dbw = $this->getMasterDB();
+               $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+
+               $job = false; // job popped off
+               $autoTrx = $dbw->getFlag( DBO_TRX ); // automatic begin() enabled?
+               $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+               try {
+                       do { // retry when our row is invalid or deleted as a duplicate
+                               $row = false; // row claimed
+                               $rand = mt_rand( 0, self::MAX_JOB_RANDOM ); // encourage concurrent UPDATEs
+                               $gte  = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
+                               // Try to reserve a DB row...
+                               if ( $this->claim( $uuid, $rand, $gte ) || $this->claim( $uuid, $rand, !$gte ) ) {
+                                       // Fetch any row that we just reserved...
+                                       $row = $dbw->selectRow( 'job', '*',
+                                               array( 'job_cmd' => $this->type, 'job_token' => $uuid ), __METHOD__ );
+                                       // Check if another process deleted it as a duplicate
+                                       if ( !$row ) {
+                                               wfDebugLog( 'JobQueueDB', "Row deleted as duplicate by another process." );
+                                               continue; // try again
+                                       }
+                                       // Get the job object from the row...
+                                       $title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
+                                       if ( !$title ) {
+                                               $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
+                                               wfDebugLog( 'JobQueueDB', "Row has invalid title '{$row->job_title}'." );
+                                               continue; // try again
+                                       }
+                                       $job = Job::factory( $row->job_cmd, $title,
+                                               self::extractBlob( $row->job_params ), $row->job_id );
+                                       // Delete any *other* duplicate jobs in the queue...
+                                       if ( $job->ignoreDuplicates() && strlen( $row->job_sha1 ) ) {
+                                               $dbw->delete( 'job',
+                                                       array( 'job_sha1' => $row->job_sha1,
+                                                               "job_id != {$dbw->addQuotes( $row->job_id )}" ),
+                                                       __METHOD__
+                                               );
+                                       }
+                               } else {
+                                       $wgMemc->set( $this->getEmptinessCacheKey(), 'true', self::CACHE_TTL );
+                               }
+                               break; // done
+                       } while( true );
+               } catch ( DBError $e ) {
+                       $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+                       throw $e;
+               }
+               $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+
+               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 integer Number of affected rows
+        */
+       protected function claim( $uuid, $rand, $gte ) {
+               $dbw  = $this->getMasterDB();
+               $dir  = $gte ? 'ASC' : 'DESC';
+               $ineq = $gte ? '>=' : '<=';
+               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.
+                       // The DB wrapper functions do not support this, so it's done manually.
+                       $dbw->query( "UPDATE {$dbw->tableName( 'job' )}
+                               SET
+                                       job_token = {$dbw->addQuotes( $uuid ) },
+                                       job_token_timestamp = {$dbw->addQuotes( $dbw->timestamp() )}
+                               WHERE (
+                                       job_cmd = {$dbw->addQuotes( $this->type )}
+                                       AND job_token = {$dbw->addQuotes( '' )}
+                                       AND job_random {$ineq} {$dbw->addQuotes( $rand )}
+                               ) ORDER BY job_random {$dir} 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() ),
+                               array( 'job_id = (' .
+                                       $dbw->selectSQLText( 'job', 'job_id',
+                                               array(
+                                                       'job_cmd'   => $this->type,
+                                                       'job_token' => '',
+                                                       "job_random {$ineq} {$dbw->addQuotes( $rand )}" ),
+                                               __METHOD__,
+                                               array( 'ORDER BY' => "job_random {$dir}", 'LIMIT' => 1 ) ) .
+                                       ')'
+                               ),
+                               __METHOD__
+                       );
+               }
+               return $dbw->affectedRows();
+       }
+
+       /**
+        * @see JobQueue::doAck()
+        * @return Job|bool
+        */
+       protected function doAck( Job $job ) {
+               $dbw = $this->getMasterDB();
+               if ( $dbw->trxLevel() ) {
+                       wfWarn( "Attempted to ack a job in a transaction; committing first." );
+                       $dbw->commit(); // push existing transaction
+               }
+
+               $autoTrx = $dbw->getFlag( DBO_TRX ); // automatic begin() enabled?
+               $dbw->clearFlag( DBO_TRX ); // make each query its own transaction
+               try {
+                       // 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() ) );
+               } catch ( Exception $e ) {
+                       $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+                       throw $e;
+               }
+               $dbw->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+
+               return true;
+       }
+
+       /**
+        * @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 ) {
+               // Rows that describe the nature of the job
+               $descFields = array(
+                       'job_cmd'       => $job->getType(),
+                       'job_namespace' => $job->getTitle()->getNamespace(),
+                       'job_title'     => $job->getTitle()->getDBkey(),
+                       'job_params'    => self::makeBlob( $job->getParams() ),
+               );
+               // Additional job metadata
+               $dbw = $this->getMasterDB();
+               $metaFields = array(
+                       'job_id'        => $dbw->nextSequenceValue( 'job_job_id_seq' ),
+                       'job_timestamp' => $dbw->timestamp(),
+                       'job_sha1'      => wfBaseConvert( sha1( serialize( $descFields ) ), 16, 36, 32 ),
+                       'job_random'    => mt_rand( 0, self::MAX_JOB_RANDOM )
+               );
+               return ( $descFields + $metaFields );
+       }
+
+       /**
+        * @return string
+        */
+       private function getEmptinessCacheKey() {
+               list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'isempty' );
+       }
+
+       /**
+        * @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..69bcf01
--- /dev/null
@@ -0,0 +1,160 @@
+<?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.20
+ */
+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 = false;
+               if ( isset( $wgJobTypeConf[$type] ) ) {
+                       $conf = $wgJobTypeConf[$type];
+               } else {
+                       $conf = $wgJobTypeConf['default'];
+               }
+
+               return JobQueue::factory( array(
+                       'class' => $conf['class'],
+                       'wiki'  => $this->wiki,
+                       'type'  => $type,
+               ) );
+       }
+
+       /**
+        * 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 );
+       }
+
+       /**
+        * 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 );
+       }
+}
index b23951c..a29f29f 100644 (file)
@@ -27,9 +27,9 @@
  * @ingroup JobQueue
  */
 class RefreshLinksJob extends Job {
-
        function __construct( $title, $params = '', $id = 0 ) {
                parent::__construct( 'refreshLinks', $title, $params, $id );
+               $this->removeDuplicates = true; // job is expensive
        }
 
        /**
@@ -70,16 +70,16 @@ class RefreshLinksJob extends Job {
        }
 
        public static function runForTitleInternal( Title $title, Revision $revision, $fname ) {
-               global $wgParser, $wgContLang;
+               global $wgContLang;
 
                wfProfileIn( $fname . '-parse' );
                $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
-               $parserOutput = $wgParser->parse(
-                       $revision->getText(), $title, $options, true, true, $revision->getId() );
+               $content = $revision->getContent();
+               $parserOutput = $content->getParserOutput( $title, $revision->getId(), $options, false );
                wfProfileOut( $fname . '-parse' );
 
                wfProfileIn( $fname . '-update' );
-               $updates = $parserOutput->getSecondaryDataUpdates( $title, false );
+               $updates = $content->getSecondaryDataUpdates( $title, null, false, $parserOutput  );
                DataUpdate::runUpdates( $updates );
                wfProfileOut( $fname . '-update' );
        }
index 37560d8..2ca525e 100644 (file)
@@ -335,9 +335,9 @@ class ManualLogEntry extends LogEntryBase {
 
        /**
         * Constructor.
-        * 
+        *
         * @since 1.19
-        * 
+        *
         * @param string $type
         * @param string $subtype
         */
@@ -357,9 +357,9 @@ class ManualLogEntry extends LogEntryBase {
         *   '4:color' => 'blue',
         *   'animal' => 'dog'
         * );
-        * 
+        *
         * @since 1.19
-        * 
+        *
         * @param $parameters array Associative array
         */
        public function setParameters( $parameters ) {
@@ -368,9 +368,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 +379,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 +390,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 +401,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 +412,9 @@ class ManualLogEntry extends LogEntryBase {
 
        /**
         * TODO: document
-        * 
+        *
         * @since 1.19
-        * 
+        *
         * @param integer $deleted
         */
        public function setDeleted( $deleted ) {
index 7586bb6..7d94a30 100644 (file)
@@ -429,6 +429,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() ) {
index d96a5ea..90393ea 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
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..d2edc9f 100644 (file)
@@ -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 784a601..104ba55 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.
         *
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 5fc5c1a..f6ca775 100644 (file)
@@ -260,6 +260,7 @@ class GIFMetadataExtractor {
 
        /**
         * @param $data
+        * @throws Exception
         * @return int
         */
        static function decodeBPP( $data ) {
@@ -276,7 +277,7 @@ class GIFMetadataExtractor {
 
        /**
         * @param $fh
-        * @return
+        * @throws Exception
         */
        static function skipBlock( $fh ) {
                while ( !feof( $fh ) ) {
@@ -290,6 +291,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 +303,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..ecf216a 100644 (file)
@@ -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 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 55fa554..75d474c 100644 (file)
@@ -135,14 +135,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;
index 851fe42..871d419 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;
@@ -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 f86cf15..156c39e 100644 (file)
@@ -35,6 +35,7 @@ class EhcacheBagOStuff extends BagOStuff {
 
        /**
         * @param $params array
+        * @throws MWException
         */
        function __construct( $params ) {
                if ( !defined( 'CURLOPT_TIMEOUT_MS' ) ) {
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..49160e8 100644 (file)
@@ -45,7 +45,7 @@ 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 e778ca8..8671665 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
         *
@@ -282,6 +289,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.
@@ -745,6 +753,7 @@ class Parser {
         *
         * @since 1.19
         *
+        * @throws MWException
         * @return Language|null
         */
        public function getTargetLanguage() {
@@ -1523,6 +1532,7 @@ class Parser {
         *
         * @param $text string
         *
+        * @throws MWException
         * @return string
         */
        function replaceExternalLinks( $text ) {
@@ -1537,6 +1547,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++];
@@ -1726,6 +1737,8 @@ class Parser {
 
        /**
         * Process [[ ]] wikilinks (RIL)
+        * @param $s
+        * @throws MWException
         * @return LinkHolderArray
         *
         * @private
@@ -1953,7 +1966,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" );
@@ -2436,6 +2456,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 +2621,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 +3132,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 +3616,13 @@ class Parser {
                        }
 
                        if ( $rev ) {
-                               $text = $rev->getText();
+                               $content = $rev->getContent();
+                               $text = $content->getWikitextForTransclusion();
+
+                               if ( $text === false || $text === null ) {
+                                       $text = false;
+                                       break;
+                               }
                        } elseif ( $title->getNamespace() == NS_MEDIAWIKI ) {
                                global $wgContLang;
                                $message = wfMessage( $wgContLang->lcfirst( $title->getText() ) )->inContentLanguage();
@@ -3601,16 +3630,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 +3729,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 +3810,7 @@ class Parser {
         *     noClose    Original text did not have a close tag
         * @param $frame PPFrame
         *
+        * @throws MWException
         * @return string
         */
        function extensionSubstitution( $params, $frame ) {
@@ -4672,6 +4708,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 ) {
@@ -4702,6 +4739,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 ) {
@@ -4764,6 +4802,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 ) {
@@ -4811,6 +4850,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 ) {
@@ -5774,6 +5817,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..b6bcf63 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;
+               }
        }
 
        /**
@@ -375,9 +401,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..b2dd7db 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 ) {
@@ -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 99fe7ed..f98266e 100644 (file)
@@ -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
@@ -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 $styles 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..db4c758 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
@@ -550,6 +554,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 +623,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 +641,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 +673,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 68f4a28..c570f0a 100644 (file)
@@ -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
@@ -425,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 );
@@ -448,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 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 623a269..28c3426 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,16 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
                if ( !$revision ) {
                        return null;
                }
-               return $revision->getRawText();
+
+               $content = $revision->getContent( Revision::RAW );
+               $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 +141,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..e1bb32f 100644 (file)
@@ -505,19 +505,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 +791,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->getTextForSearchIndex();
+                       } else { // TODO: can we fetch raw wikitext for commons images?
                                $this->mText = '';
-
+                       }
                }
        }
 
@@ -819,6 +809,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 )
diff --git a/includes/site/MediaWikiSite.php b/includes/site/MediaWikiSite.php
new file mode 100644 (file)
index 0000000..71a17c8
--- /dev/null
@@ -0,0 +1,325 @@
+<?php
+
+/**
+ * Class representing a MediaWiki site.
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @licence GNU GPL v2+
+ * @author John Erling Blad < jeblad@gmail.com >
+ * @author Daniel Kinzler
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+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 or $egWBRemoteTitleNormalization is set to false, 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 ) {
+               global $egWBRemoteTitleNormalization;
+
+               // 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 string|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..350a19d
--- /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
+ *
+ * @licence 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..df43148
--- /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
+ *
+ * @licence 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..68bd106
--- /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
+ *
+ * @licence 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..7f143d1
--- /dev/null
@@ -0,0 +1,537 @@
+<?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
+ *
+ * @licence 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 false;
+               }
+
+               return parse_url( $path, PHP_URL_SCHEME );
+       }
+
+       /**
+        * 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 ORMRow::save
+        * @see Site::save
+        *
+        * @since 1.21
+        *
+        * @param string|null $functionName
+        *
+        * @return boolean Success indicator
+        */
+       public function save( $functionName = null ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $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;
+       }
+
+       /**
+        * @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..9e87ed9
--- /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
+ *
+ * @licence 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..71e55f8
--- /dev/null
@@ -0,0 +1,135 @@
+<?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
+ *
+ * @licence 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(),
+               );
+       }
+
+       /**
+        * 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 7143d5b..faaab72 100644 (file)
@@ -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..fb65326 100644 (file)
@@ -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 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..ca8c9c8 100644 (file)
@@ -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 = Xml::tags( 'td', array( 'colspan' => 2 ),
+                       $deletedOnlyCheck .
                        Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
                                Xml::checkLabel(
                                        $this->msg( 'sp-contributions-toponly' )->text(),
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 1f05749..bc9a3d9 100644 (file)
@@ -373,26 +373,32 @@ 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(
+                                       '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 8e15d55..bd7b41f 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() ) {
@@ -459,11 +456,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 +486,7 @@ class NewPagesPager extends ReverseChronologicalPager {
        }
 
        function getQueryInfo() {
-               global $wgEnableNewpagesUserFilter, $wgGroupPermissions;
+               global $wgEnableNewpagesUserFilter;
                $conds = array();
                $conds['rc_new'] = 1;
 
@@ -510,7 +508,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..97f0037 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 ) {
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..6c33bb8 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";
                }
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 6ebaed5..4c38a78 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;
                }
 
@@ -401,11 +432,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 +468,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 +495,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 +531,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,7 +572,7 @@ 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" );
                                }
                        }
                }
@@ -527,7 +593,7 @@ class PageArchive {
                        // unless we are specifically removing all restrictions...
                        $revision = Revision::newFromArchiveRow( $row,
                                array(
-                                       'page' => $pageId,
+                                       'title' => $this->title,
                                        'deleted' => $unsuppress ? 0 : $row->ar_deleted
                                ) );
 
@@ -546,7 +612,7 @@ class PageArchive {
 
                // Was anything restored at all?
                if ( $restored == 0 ) {
-                       return 0;
+                       return Status::newGood( 0 );
                }
 
                $created = (bool)$newid;
@@ -566,13 +632,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 +851,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 +907,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 +928,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 +985,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 +1000,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 +1021,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 +1280,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 +1520,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..fd24af1 100644 (file)
@@ -525,6 +525,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 +646,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 +790,8 @@ class UploadForm extends HTMLForm {
         * @return Array: descriptor array
         */
        protected function getSourceSection() {
+               global $wgCopyUploadsFromSpecialUpload;
+
                if ( $this->mSessionKey ) {
                        return array(
                                'SessionKey' => array(
@@ -802,7 +805,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 +1111,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 039f569..f80e7da 100644 (file)
@@ -151,7 +151,7 @@ class LoginForm extends SpecialPage {
 
                global $wgSecureLogin;
                if (
-                       $this->mType != 'signup' &&
+                       $this->mType !== 'signup' &&
                        $wgSecureLogin &&
                        WebRequest::detectProtocol() !== 'https'
                ) {
@@ -286,6 +286,7 @@ class LoginForm extends SpecialPage {
 
        /**
         * @private
+        * @throws PermissionsError|ReadOnlyError
         * @return bool|User
         */
        function addNewAccountInternal() {
@@ -442,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;
        }
 
        /**
@@ -451,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 );
@@ -483,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 );
        }
 
        /**
@@ -729,7 +739,14 @@ 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;
        }
 
@@ -747,7 +764,12 @@ class LoginForm extends SpecialPage {
                                } else {
                                        $user->invalidateCache();
                                }
-                               $user->setCookies( null, $wgSecureLogin && !$this->mStickHTTPS ? false : null );
+
+                               if( $wgSecureLogin && !$this->mStickHTTPS ) {
+                                       $user->setCookies( null, false );
+                               } else {
+                                       $user->setCookies();
+                               }
                                self::clearLoginToken();
 
                                // Reset the throttle
@@ -980,19 +1002,22 @@ class LoginForm extends SpecialPage {
                        $returnToTitle = Title::newMainPage();
                }
 
-               if( $wgSecureLogin && !$this->mStickHTTPS ) {
+               if ( $wgSecureLogin && !$this->mStickHTTPS ) {
                        $options = array( 'http' );
                        $proto = PROTO_HTTP;
-               } else {
+               } elseif( $wgSecureLogin ) {
                        $options = array( 'https' );
                        $proto = PROTO_HTTPS;
+               } else {
+                       $options = array();
+                       $proto = PROTO_RELATIVE;
                }
 
                if ( $type == 'successredirect' ) {
                        $redirectUrl = $returnToTitle->getFullURL( $returnToQuery, false, $proto );
                        $this->getOutput()->redirect( $redirectUrl );
                } else {
-                       $this->getOutput()->addReturnTo( $returnToTitle, $returnToQuery, $options );
+                       $this->getOutput()->addReturnTo( $returnToTitle, $returnToQuery, null, $options );
                }
        }
 
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..56ae302 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
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 0542bba..b0e5fb6 100644 (file)
@@ -76,7 +76,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();
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 c7fd23a..560acde 100644 (file)
@@ -319,8 +319,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 +361,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 +416,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 e118e72..c4807a6 100644 (file)
@@ -54,6 +54,7 @@ class FakeConverter {
        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(); }
@@ -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];
@@ -3524,6 +3547,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
         *
index 56b885f..6016605 100644 (file)
@@ -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;
        }
 
        /**
@@ -925,7 +946,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!
                                }
                        }
                }
@@ -1035,9 +1060,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?
@@ -1046,9 +1071,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 );
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..6482070 100644 (file)
@@ -116,7 +116,7 @@ class LanguageGan extends LanguageZh {
                                                                array(),
                                                                $ml );
 
-               $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
        /**
index 7402b08..79e5582 100644 (file)
@@ -233,6 +233,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..bdaf2f4 100644 (file)
@@ -440,7 +440,7 @@ class LanguageKk extends LanguageKk_cyrl {
 
                $this->mConverter = new KkConverter( $this, 'kk', $variants, $variantfallbacks );
 
-               $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
        /**
index d60f083..0eac439 100644 (file)
@@ -273,6 +273,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 36f3407..4833d1c 100644 (file)
@@ -212,6 +212,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 5f1110d..b472743 100644 (file)
@@ -246,7 +246,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 d6ddf10..a2c917c 100644 (file)
@@ -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..8bf66a3 100644 (file)
@@ -146,7 +146,7 @@ class LanguageZh extends LanguageZh_hans {
                                                                array(),
                                                                $ml );
 
-               $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
        /**
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..a770906 100644 (file)
@@ -693,8 +693,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 +1206,7 @@ Data nyang la'én eunteuk teupeusom keudroë.
 # Special:Tags
 'tag-filter' => 'Filter [[Special:Tags|tag]]:',
 
+# Search suggestions
+'searchsuggest-search' => 'Mita',
+
 );
index 2e2ed5e..3aa6b1f 100644 (file)
@@ -417,7 +417,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''أنت الآن غير مسجل الدخول.'''
 
-تستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو [[Special:UserLogin|الدخول مرة أخرى]] بنفس الاسم أو باسم آخر.
+تستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو <span class='plainlinks'>[$1 الدخول مرة أخرى]</span> بنفس الاسم أو باسم آخر.
 من الممكن أن ترى بعض الصفحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإفراغ الصفحات المختزنة في المتصفح لديك.",
 'welcomecreation' => '== مرحبا، $1! ==
 تم إنشاء حسابك.
index 3756dfd..cd22f49 100644 (file)
@@ -352,7 +352,6 @@ $messages = array(
 'qbbrowse' => 'Snuffel',
 'qbedit' => 'Wysig',
 'qbpageoptions' => 'Bladsyopsies',
-'qbpageinfo' => 'Bladsyinligting',
 'qbmyoptions' => 'My bladsye',
 'qbspecialpages' => 'Spesiale bladsye',
 'faq' => 'Gewilde vrae',
@@ -616,7 +615,7 @@ 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;
@@ -1229,8 +1228,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',
@@ -2866,7 +2863,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".',
@@ -3824,6 +3820,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.',
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..a94eac8 100644 (file)
@@ -451,7 +451,7 @@ 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! ==
 
@@ -929,8 +929,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 +1619,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 6f6f598..4228fe0 100644 (file)
@@ -182,7 +182,6 @@ $messages = array(
 'qbbrowse' => 'ቃኝ',
 'qbedit' => 'አርም',
 'qbpageoptions' => 'ይህ ገጽ',
-'qbpageinfo' => 'አግባብ',
 'qbmyoptions' => 'የኔ ገጾች',
 'qbspecialpages' => 'ልዩ ገጾች',
 'faq' => 'ብጊየጥ (ብዙ ጊዜ የሚጠየቁ ጥያቀዎች)',
@@ -736,8 +735,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' => 'ሁሉ',
@@ -2268,6 +2265,10 @@ $3
 # New logging system
 'newuserlog-byemail' => 'ማለፊያ-ቃል በኤ-መልዕክት ተልኳል',
 
+# Search suggestions
+'searchsuggest-search' => 'ፈልግ',
+'searchsuggest-containing' => 'በመጣጥፎች ይዘት ለመፈልግ...',
+
 # API errors
 'api-error-badaccess-groups' => 'እርስዎ በዚህ ውኪ ላይ ፋይል እንድሊኩ አልተፈቀደም።',
 'api-error-badtoken' => 'የውስጥ ስህተት: መጥፎ ጥቅል።',
index 293616c..6b2746a 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,7 +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.",
+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.",
 'welcomecreation' => "== ¡Bienveniu(da), $1! ==
 S'ha creyato a suya cuenta.
 No xublide de presonalizar [[Special:Preferences|as suyas preferencias en {{SITENAME}}]].",
@@ -1085,8 +1084,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',
@@ -2651,7 +2648,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 +3629,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..3b55cfb 100644 (file)
@@ -359,7 +359,7 @@ 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! ==
 
@@ -568,8 +568,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>.',
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 f3cb5bb..856ab4c 100644 (file)
@@ -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' => 'اعرض التاريخ',
@@ -881,7 +880,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''أنت الآن غير مسجل الدخول.'''
 
-تستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو [[Special:UserLogin|الدخول مرة أخرى]] بنفس الاسم أو باسم آخر.
+تستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو <span class='plainlinks'>[$1 الدخول مرة أخرى]</span> بنفس الاسم أو باسم آخر.
 من الممكن أن ترى بعض الصفحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإفراغ الصفحات المختزنة في المتصفح لديك.",
 'welcomecreation' => '== مرحبا، $1! ==
 تم إنشاء حسابك.
@@ -1520,8 +1519,6 @@ $1",
 'search-interwiki-caption' => 'المشاريع الشقيقة',
 'search-interwiki-default' => '$1 نتيجة:',
 'search-interwiki-more' => '(المزيد)',
-'search-mwsuggest-enabled' => 'مع اقتراحات',
-'search-mwsuggest-disabled' => 'لا اقتراحات',
 'search-relatedarticle' => 'مرتبطة',
 'mwsuggest-disable' => 'عطل اقتراحات أجاكس',
 'searcheverything-enable' => 'ابحث في جميع النطاقات',
@@ -2189,7 +2186,7 @@ $1',
 'shared-repo' => 'مستودع مشترك',
 'shared-repo-name-wikimediacommons' => 'ويكيميديا كومنز',
 'filepage.css' => '/* CSS المعروض هنا سيضمن في صفحات وصف الملفات، أيضا على الويكيات الأجنبية */',
-'upload-disallowed-here' => 'لأسف لا يمكنك تعديل هذه الصورة.',
+'upload-disallowed-here' => 'للأسف لا يمكنك تعديل هذه الصورة.',
 
 # File reversion
 'filerevert' => 'استرجع $1',
@@ -2738,8 +2735,8 @@ $UNWATCHURL
 'undeletedrevisions' => 'تم استرجاع {{PLURAL:$1|تعديل واحد|تعديلين|$1 تعديلات|$1 تعديل|$1 تعديلا}}',
 'undeletedrevisions-files' => 'أسترجعت {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}}  و{{PLURAL:$2||ملف واحد|ملفان|$2 ملفات|$2 ملفًا|$2 ملف}}',
 'undeletedfiles' => 'أسترجع {{PLURAL:$1||ملف واحد|ملفان|$1 ملفات|$1 ملفًا|$1 ملف}}',
-'cannotundelete' => 'Ù\81Ø´Ù\84 Ø§Ù\84استرجاع؛
-ربÙ\85ا Ù\82اÙ\85 Ø´Ø®Øµ Ø¢Ø®Ø± Ø¨Ø§Ø³ØªØ±Ø¬Ø§Ø¹ Ø§Ù\84صÙ\81حة Ø¨Ø§Ù\84Ù\81عÙ\84.',
+'cannotundelete' => 'Ù\81Ø´Ù\84 Ø¥Ù\84غاء Ø§Ù\84حذÙ\81؛
+ربÙ\85ا Ù\82اÙ\85 Ø´Ø®Øµ Ø¢Ø®Ø± Ø¨Ø¥Ù\84غاء Ø­Ø°Ù\81 Ø§Ù\84صÙ\81حة Ù\82بÙ\84Ù\83.',
 'undeletedpage' => "'''تم استرجاع $1'''
 
 راجع [[Special:Log/delete|سجل الحدف]] لمعاينة عمليات الحذف والاسترجاعات الحديثة.",
@@ -3177,7 +3174,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'اختبار جافاسكربت',
-'javascripttest-disabled' => 'هذه الخاصية معطلة.',
 'javascripttest-title' => 'تشغيل أختبارات $1',
 'javascripttest-pagetext-noframework' => 'هذه الصفحة محجوزة لإجراء أختبارات الجافا سكريبت.',
 'javascripttest-pagetext-unknownframework' => 'إطار اختبار غير معروف "$1".',
@@ -3343,7 +3339,6 @@ $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)',
@@ -4330,6 +4325,10 @@ $5
 'feedback-bugcheck' => 'رائع! تحقق من أن هذه ليست إحدى [$1 العلل المعروفة].',
 'feedback-bugnew' => 'لقد تحققت. بلّغ عن علة جديدة.',
 
+# Search suggestions
+'searchsuggest-search' => 'بحث',
+'searchsuggest-containing' => 'يحتوي...',
+
 # API errors
 'api-error-badaccess-groups' => 'لا يسمح لك بتحميل الملفات إلى هذه الويكي.',
 'api-error-badtoken' => 'خطأ داخلي: رمز مميز غير صحيح.',
index e26e5ae..7980208 100644 (file)
@@ -116,6 +116,7 @@ $messages = array(
 'tog-watchdefault' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܘܠܦܦ̈ܐ ܕܫܚܠܦ ܐܢܐ ܠܪ̈ܗܝܬܝ',
 'tog-watchmoves' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܘܠܦܦ̈ܐ ܕܫܢܐ ܐܢܐ ܠܪ̈ܗܝܬܝ',
 'tog-watchdeletion' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܘܠܦܦ̈ܐ ܕܫܐܦ ܐܢܐ ܠܪ̈ܗܝܬܝ',
+'tog-oldsig' => 'ܪܡܝ ܐܝܕܐ ܗܫܝܐ:',
 'tog-watchlisthideown' => 'ܛܫܝ ܫܘܚܠܦ̈ܝ ܡܢ ܪ̈ܗܝܬܐ',
 'tog-watchlisthidebots' => 'ܛܫܝ ܫܘܚܠܦ̈ܐ ܕܒܘܬ ܡܢ ܪ̈ܗܝܬܐ',
 'tog-watchlisthideminor' => 'ܛܫܝ ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ ܡܢ ܪ̈ܗܝܬܐ',
@@ -191,7 +192,7 @@ $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 ܠܦܦ̈ܐ ܕܐܬܝܢ ܐܝܬܝܗܘܢ}} ܒܣܕܪܐ ܗܢܐ، ܡܢ ܣܘܝܟܐ ܕ$2.}}',
+'category-file-count' => '{{PLURAL:$2|ܣܕܪܐ ܗܢܐ ܐܝܬ ܒܗ ܠܦܦܐ ܗܢܐ ܒܠܚܘܕ.|{{PLURAL:$1|ܠܦܦܐ ܕܐܬܐ ܐܝܬܘܗܝ|$1 ܠܦܦ̈ܐ ܕܐܬܝܢ ܐܝܬܝܗܘܢ}} ܒܣܕܪܐ ܗܢܐ، ܡܢ ܣܘܝܟܐ ܕ$2 ܟܠܢܐܝܬ.}}',
 'category-file-count-limited' => 'ܐܝܬ {{PLURAL:$1|ܠܦܦܐ ܕܐܬܐ|$1 ܠܦܦ̈ܐ ܕܐܬܝܢ}} ܒܣܕܪܐ ܗܫܝܐ.',
 'listingcontinuesabbrev' => '(ܫܘܠܡܐ)',
 
@@ -387,7 +388,7 @@ $1',
 # Login and logout pages
 'logouttext' => "'''ܗܫܐ ܦܠܛܠܟ ܡܢ ܚܘܫܒܢܟ.'''
 
-ܡܨܐ ܐܢܬ ܐܦܠܚܬ {{SITENAME}} ܐܝܟ ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ ܐܘ ܡܨܐ ܐܢܬ ܕ[[Special:UserLogin|ܬܥܘܠ]] ܒܚܘܫܒܢܐ ܥܝܢܗ ܐܘ ܐܝܟ ܡܦܠܚܢܐ ܐܚܪܢܐ.
+ܡܨܐ ܐܢܬ ܐܦܠܚܬ {{SITENAME}} ܐܝܟ ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ ܐܘ ܡܨܐ ܐܢܬ ܕ<span class='plainlinks'>[$1 ܬܥܘܠ]</span> ܒܚܘܫܒܢܐ ܥܝܢܗ ܐܘ ܐܝܟ ܡܦܠܚܢܐ ܐܚܪܢܐ.
 
 ܚܕ ܟܡܐ ܡܢ ܦܐܬܬ̈ܐ ܡܬܚܙܝܢ ܐܝܟ ܕܗܘ ܐܢܬ ܥܠܝܠܐ ܥܕܡܐ ܕܐܣܦܩܬ ܠܦܐܬܬ̈ܐ ܠܒܝܟܬ̈ܐ ܕܡܦܐܬܢܐ ܕܝܠܟ",
 'welcomecreation' => '== ܒܫܝܢܐ, $1! ==
@@ -426,7 +427,7 @@ $1',
 'passwordremindertitle' => 'ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܢܝܬܐ ܚܕܬܐ ܠ{{SITENAME}}',
 'noemail' => 'ܠܝܬ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܠܡܦܠܚܢܐ "$1".',
 'mailerror' => 'ܦܘܕܐ ܒܫܘܕܪܐ ܕܒܝܠܕܪܐ: $1',
-'emailconfirmlink' => 'Ü\9aܬܬ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܕܝܠܟ',
+'emailconfirmlink' => 'ܫܪܪ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܕܝܠܟ',
 'accountcreated' => 'ܚܘܫܒܢܐ ܒܪܐ',
 'accountcreatedtext' => 'ܐܬܒܪܝ ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ ܠ $1.',
 'createaccount-title' => 'ܒܪܝܐ ܕܚܘܫܒܢܐ ܒ {{SITENAME}}',
@@ -633,13 +634,12 @@ $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' => 'ܒܨܝܐ ܡܬܩܕܡܢܐ',
@@ -681,7 +681,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 +700,7 @@ $1',
 'prefs-namespaces' => 'ܚܩܠܬ̈ܐ',
 'defaultns' => 'ܐܘ ܒܨܝ ܒܚܩܠܬ̈ܐ ܗܢܝܢ',
 'prefs-files' => 'ܠܦܦ̈ܐ',
-'prefs-emailconfirm-label' => 'Ü\9aÜ\98ܬܬܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:',
+'prefs-emailconfirm-label' => 'Ü«Ü\98ܪܪܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:',
 'youremail' => 'ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:',
 'username' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
 'uid' => 'ܗܝܝܘܬܐ ܕܡܦܠܚܢܐ:',
@@ -715,6 +715,8 @@ $1',
 'gender-unknown' => 'ܠܐ ܦܣܝܩܐ',
 'gender-male' => 'ܕܟܪܐ',
 'gender-female' => 'ܢܩܒܐ',
+'prefs-help-gender' => 'ܨܒܝܢܝܐ: ܐܬܦܠܚ ܠܡܬܡܠܠ ܒܓܢܣܐ ܬܪܝܨܐ ܒܝܕ ܬܚܪܙܬܐ.
+ܝܕܥܬܐ ܗܕܐ ܬܗܘܐ ܓܠܝܬܐ ܠܥܠܡܐ.',
 'email' => 'ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
 'prefs-info' => 'ܝܕ̈ܥܬܐ ܪ̈ܫܝܬܐ',
 'prefs-i18n' => 'ܬܘܪܓܡܐ',
@@ -743,6 +745,7 @@ $1',
 # Groups
 'group' => 'ܟܢܘܫܬܐ:',
 'group-user' => 'ܡܦܠܚܢ̈ܐ',
+'group-autoconfirmed' => 'ܡܦܠܚܢ̈ܐ ܡܫܪܪ̈ܐ ܝܬܐܝܬ',
 'group-bot' => 'ܒܘܬ̈ܐ',
 'group-sysop' => 'ܡܕܒܪ̈ܢܐ',
 'group-bureaucrat' => 'ܒܝܪܘܩܪ̈ܛܐ',
@@ -750,14 +753,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 +797,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 +862,7 @@ $1',
 'minlength1' => 'ܫܡܗ̈ܐ ܕܠܦܦܐ ܘܠܐ ܕܢܗܘܐ ܒܪܝܐ ܡܢ ܐܬܘܬܐ ܚܕܐ ܟܕ ܙܥܘܪ',
 'uploadwarning' => 'ܐܣܩ ܙܘܗܪܐ',
 'savefile' => 'ܠܒܘܟ ܠܦܦܐ',
-'uploadedimage' => '',
+'uploadedimage' => 'ܐܣܩ "[[$1]]"',
 'uploadvirus' => 'ܠܦܦܐ ܐܝܬ ܒܗ ܒܝܪܘܣ!
 ܐܪ̈ܝܟܬܐ: $1',
 'upload-source' => 'ܡܒܘܥܐ ܕܠܦܦܐ',
@@ -976,7 +979,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' => 'ܫܘܦ',
 
@@ -1181,7 +1184,7 @@ $1',
 
 # Delete
 'deletepage' => 'ܫܘܦ ܦܐܬܐ',
-'confirm' => 'Ü\9aܬܬ',
+'confirm' => 'ܫܪܪ',
 'excontent' => "ܚܒܝܫܬ̈ܐ ܗܘ̈ܝ: '$1'",
 'excontentauthor' => "ܚܒܝܫܬ̈ܐ ܗܘ̈ܝ: '$1' (ܘܫܘܬܦܢܐ ܝܚܝܕܝܐ ܗܘܐ '[[Special:Contributions/$2|$2]]')",
 'exblank' => 'ܦܐܬܐ ܣܦܝܩܬܐ ܗܘܐ',
@@ -1210,7 +1213,7 @@ $1',
 'unprotectedarticle' => 'ܫܩܘܠ ܢܛܝܪܘܬܐ ܡܢ "[[$1]]"',
 'movedarticleprotection' => 'ܫܢܐ ܛܘܝܒ̈ܐ ܕܢܛܪܐ ܡܢ "[[$2]]" ܠ "[[$1]]"',
 'prot_1movedto2' => '[[$1]] ܐܬܫܢܝܬ ܠ [[$2]]',
-'protect-legend' => 'Ü\9aܬܬ ܢܘܛܪܐ',
+'protect-legend' => 'ܫܪܪ ܢܘܛܪܐ',
 'protectcomment' => 'ܥܠܬܐ:',
 'protect-default' => 'ܦܣܣܐ ܠܟܠ ܡܦܠܚܢ̈ܐ',
 'protect-fallback' => 'ܒܥܝ "$1" ܦܣܣܐ',
@@ -1426,7 +1429,7 @@ Do you want to change the settings?',
 'tooltip-pt-mytalk' => 'ܦܐܬܐ ܕܡܡܠܘܟ',
 'tooltip-pt-preferences' => 'Your preferences',
 'tooltip-pt-watchlist' => 'ܡܟܬܒܢܘܬܐ ܕܦܐܬܬ̈ܐ ܕܒܪܗܝܬ ܐܢܬ ܫܘܚܠܦ̈ܐ ܕܬܗܘܐ ܒܗܘܢ',
-'tooltip-pt-mycontris' => 'ܡܟܬܒܢܘܬܐ ܕܫܘܬܦܘܝܬܘ̈ܟ',
+'tooltip-pt-mycontris' => 'ܡܟܬܒܢܘܬܐ ܕܫܘܬܦܘܝܬ̈ܟ',
 'tooltip-pt-login' => 'ܢܠܒܒ ܠܟ ܕܣܓܠ ܐܢܬ ܥܠܠܐ ܕܝܠܟ، ܐܠܐ ܗܢܐ ܠܐ ܐܝܬܝܗܝ ܐܠܨܝܐ',
 'tooltip-pt-logout' => 'ܦܠܛܐ',
 'tooltip-ca-talk' => 'ܡܡܠܠܐ ܥܠ ܚܒܝܫܬܐ ܕܦܐܬܐ',
@@ -1439,7 +1442,7 @@ Do you want to change the settings?',
 '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' => 'ܡܟܬܒܢܘܬܐ ܒܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܒܓܘ ܘܝܩܝ.',
@@ -1453,9 +1456,9 @@ Do you want to change the settings?',
 '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}}',
@@ -1562,10 +1565,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' => 'ܒܪܝ ܙܒܢܬܐ ܐܚܪܬܐ',
@@ -1687,4 +1690,8 @@ $1',
 'feedback-message' => 'ܐܓܪܬܐ:',
 'feedback-cancel' => 'ܒܛܘܠ',
 
+# Search suggestions
+'searchsuggest-search' => 'ܒܨܝ',
+'searchsuggest-containing' => 'ܬܚܒܘܫ...',
+
 );
index e5397fa..d10ed89 100644 (file)
@@ -418,7 +418,7 @@ 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! ==
@@ -957,8 +957,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ṫ',
index aac01e1..e4d8485 100644 (file)
@@ -445,7 +445,6 @@ $messages = array(
 'qbbrowse' => 'تصفح',
 'qbedit' => 'عدل',
 'qbpageoptions' => ' الصفحه دى',
-'qbpageinfo' => 'السياق',
 'qbmyoptions' => 'صفحاتى',
 'qbspecialpages' => 'الصفحات الخاصة',
 'faq' => 'اسئله بتتسئل كتير',
@@ -682,7 +681,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''أنت دلوقتى مش مسجل دخولك.'''
 
-تقدر تكمل استعمال {{SITENAME}} على انك مجهول، أو [[Special:UserLogin|الدخول مرة تانيه]] بنفس الاسم أو باسم تاني.
+تقدر تكمل استعمال {{SITENAME}} على انك مجهول، أو <span class='plainlinks'>[$1 الدخول مرة تانيه]</span> بنفس الاسم أو باسم تاني.
 ممكن تشوف بعض الصفحات  كأنك متسجل ، و دا علشان استعمال الصفحات المتخبية فى المتصفح بتاعك.",
 'welcomecreation' => '== اهلاً و سهلا يا $1! ==
 اتفتحلك حساب.
@@ -1224,8 +1223,6 @@ $1",
 'search-interwiki-caption' => 'المشاريع الشقيقة',
 'search-interwiki-default' => '$1 نتيجة:',
 'search-interwiki-more' => '(اأكتر)',
-'search-mwsuggest-enabled' => 'مع اقتراحات',
-'search-mwsuggest-disabled' => 'مافيش اقتراحات',
 'search-relatedarticle' => 'مرتبطه',
 'mwsuggest-disable' => 'تعطيل اقتراحات أجاكس',
 'searcheverything-enable' => 'دور فى النطاقات كلها.',
@@ -3486,4 +3483,8 @@ $5
 'revdelete-unrestricted' => 'شيل الضوابط من على السيسوبات',
 'newuserlog-byemail' => 'الباسورد اتبعتت بالايميل',
 
+# Search suggestions
+'searchsuggest-search' => 'تدوير',
+'searchsuggest-containing' => 'جوّاه...',
+
 );
index 2e86ea2..0d00d74 100644 (file)
@@ -327,7 +327,6 @@ $messages = array(
 'qbbrowse' => 'ব্ৰাওজ',
 'qbedit' => 'সম্পাদনা',
 'qbpageoptions' => 'এই পৃষ্ঠা',
-'qbpageinfo' => 'প্ৰসংগ',
 'qbmyoptions' => 'মোৰ পৃষ্ঠাসমূহ',
 'qbspecialpages' => 'বিশেষ পৃষ্ঠাসমূহ',
 'faq' => 'সততে উদিত প্ৰশ্নসমূহ (FAQ)',
@@ -446,6 +445,8 @@ $1',
 'youhavenewmessages' => 'আপোনাৰ কাৰণে $1 আছে। ($2)',
 'newmessageslink' => 'নতুন সংবাদ',
 'newmessagesdifflink' => 'শেহতীয়া সাল-সলনি',
+'newmessageslinkplural' => '{{PLURAL:$1|এটা নতুন বাৰ্তা|নতুন বাৰ্তা}}',
+'newmessagesdifflinkplural' => 'অন্তিম {{PLURAL:$1|সংশোধন}}',
 'youhavenewmessagesmulti' => '$1ত আপোনাৰ কাৰণে নতুন সংবাদ আছে',
 'editsection' => 'সম্পাদনা কৰক',
 'editold' => 'সম্পাদনা',
@@ -582,7 +583,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''আপুনি প্ৰস্থান কৰিলে ।'''
 
-আপুনি বেনামী ভাবেও {{SITENAME}} ব্যৱহাৰ কৰিব পাৰে, অথবা আকৌ সেই একে বা বেলেগ নামেৰে [[Special:UserLogin|প্ৰৱেশ]] কৰিব পাৰে।
+আপুনি বেনামী ভাবেও {{SITENAME}} ব্যৱহাৰ কৰিব পাৰে, অথবা আকৌ সেই একে বা বেলেগ নামেৰে <span class='plainlinks'>[$1 প্ৰৱেশ]</span> কৰিব পাৰে।
 মন কৰিব যে যেতিয়ালৈকে আপোনাৰ ব্ৰাউজাৰৰ অস্থায়ী-স্মৃতি (cache memory) খালী নকৰে, তেতিয়ালৈকে কিছুমান পৃষ্ঠাত আপুনি প্ৰৱেশ কৰা বুলি দেখুৱাই থাকিব পাৰে।",
 'welcomecreation' => '== আদৰিছোঁ, $1! ==
 আপোনাৰ সদস্যভুক্তি হৈ গ’ল ।
@@ -1203,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' => 'সকলো নামস্থানত অনুসন্ধান কৰক',
@@ -1323,7 +1322,7 @@ $1",
 'yourlanguage' => 'ভাষা:',
 'yourvariant' => 'বিষয়-বস্তুৰ ভাষা বিকল্প',
 'prefs-help-variant' => 'এই ৱিকিৰ সমল পৃষ্ঠাসমূহ প্ৰদৰ্শন কৰিবলে আপোনাৰ পছন্দৰ অপৰ অথবা বৰ্ণবিন্যাস।',
-'yournick' => 'নতà§\81ন à¦¸à§\8dবাà¦\95à§\8dষà§\8dযৰ:',
+'yournick' => 'নতুন স্বাক্ষৰ:',
 'prefs-help-signature' => 'কথা-বতৰা পৃষ্ঠাত মন্তব্যসমূহৰ তলত "<nowiki>~~~~</nowiki>" লিখিলে ই স্বয়ংক্ৰিয়ভাৱে আপোনাৰ নাম আৰু সময় সংযুক্ত কৰিব ।',
 'badsig' => 'অনুপযোগী স্বাক্ষ্যৰ, HTML টেগ পৰীক্ষা কৰি লওক।',
 'badsiglength' => 'আপোনাৰ স্বাক্ষৰ অত্যাধিক দীঘলীয়া ।
@@ -1998,6 +1997,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'mostlinkedtemplates' => 'সৰ্বোচ্চ সংযোজিত সাঁচসমূহ',
 'mostcategories' => 'সৰ্বোচ্চ শ্ৰেণীসমৃদ্ধ প্ৰবন্ধসমূহ',
 'mostimages' => 'সৰ্বোচ্চ সংযোজিত ফাইলসমূহ',
+'mostinterwikis' => 'সৰ্বোচ্চ আন্তঃৱিকিসমৃদ্ধ পৃষ্ঠাসমূহ',
 'mostrevisions' => 'অধিকবাৰ সম্পাদনা কৰা পৃষ্ঠাসমূহ',
 'prefixindex' => 'উপসৰ্গসহ সকলো পৃষ্ঠা',
 'prefixindex-namespace' => 'উপসৰ্গ ($1 namespace) -ৰ সৈতে সকলো পৃষ্ঠা',
@@ -2143,6 +2143,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|আপোনাৰ সদস্য পছন্দসমূহ]]ত প্ৰৱেশ কৰা ই-মেইল ঠিকনাটো প্ৰেৰকৰ ঠিকনা হিছাপে দেখা যাব, যাতে মেইলৰ প্ৰাপকে আপোনাক উত্তৰ দিব পাৰে ।',
@@ -2289,6 +2291,7 @@ $UNWATCHURL
 'rollback' => 'সম্পাদনা পূৰ্ববৎ কৰক',
 'rollback_short' => 'পূৰ্ববৎ কৰক',
 'rollbacklink' => 'পূৰ্ববৎ কৰক',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|সম্পাদনা|সম্পাদনাসমূহ}} পূৰ্বৱত কৰক',
 'rollbackfailed' => 'পূৰ্ববৎ ব্যৰ্থ',
 'cantrollback' => 'পূৰ্বৰ অৱস্থালৈ ঘূৰাই নিব নোৱাৰি;
 শেষৰ সম্পাদকজন এই পৃষ্ঠাৰ একমাত্ৰ লেখক ।',
@@ -2842,7 +2845,6 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 
 # JavaScriptTest
 'javascripttest' => 'জাভাস্ক্ৰিপ্ট পৰীক্ষা।',
-'javascripttest-disabled' => 'এই ৱিকিত এই কাৰ্যটো সক্ৰিয় কৰা হোৱা নাই।',
 'javascripttest-title' => '$1 পৰীক্ষাসমূহ চলোৱা হৈছে',
 'javascripttest-pagetext-noframework' => 'এই পৃষ্ঠাখন জাভালিপি পৰীক্ষা চলোৱাৰ বাবে সংৰক্ষিত।',
 'javascripttest-pagetext-unknownframework' => 'অজ্ঞাত সম্পৰীক্ষা ফ্ৰেমৱৰ্ক "$1"।',
@@ -2880,9 +2882,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' => 'ইয়ালৈ সংযোজিত সকলো পৃষ্ঠাৰ সুচী',
@@ -3799,6 +3801,10 @@ $5
 'feedback-bugcheck' => 'অতি উত্তম! কেৱল পৰীক্ষা কৰক যে ই ইতিমধ্যে [$1 জ্ঞাত বাগসমূহ]ৰ এটা নহয়।',
 'feedback-bugnew' => 'মই পৰীক্ষা কৰিলো। এটা নতুন বাগ সংবাদন কৰক',
 
+# Search suggestions
+'searchsuggest-search' => 'সন্ধান কৰক',
+'searchsuggest-containing' => 'যি আছে...',
+
 # API errors
 'api-error-badaccess-groups' => "এই ৱিকিত ফাইল আপল'ড কৰিবলৈ আপোনাৰ অনুমতি নাই।",
 'api-error-badtoken' => 'আভ্যন্তৰীণ ত্ৰুটি: ভুল টোকেন।',
index c0e7226..9f91067 100644 (file)
@@ -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',
@@ -439,10 +438,11 @@ Por favor vuelvi intentalo nunos minutos.',
 'protectedpagetext' => 'Esta páxina ta candada pa torgar la so edición.',
 '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,7 +468,7 @@ 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.
@@ -747,8 +747,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ó.
@@ -858,6 +857,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 +1122,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',
@@ -1211,7 +1217,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',
@@ -1646,7 +1652,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".',
@@ -2326,7 +2332,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.",
@@ -2624,6 +2631,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 +2761,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.",
@@ -2918,10 +2925,10 @@ 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',
 
 # Skin names
 'skinname-standard' => 'Clásicu',
@@ -3507,7 +3514,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
@@ -3780,6 +3788,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.',
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..532fd1c 100644 (file)
@@ -230,7 +230,6 @@ $messages = array(
 'qbbrowse' => 'Farura',
 'qbedit' => 'Betara',
 'qbpageoptions' => 'Ikatcuksbu',
-'qbpageinfo' => 'Givabu',
 'qbmyoptions' => 'Jinaf ikatcukseem',
 'qbspecialpages' => 'Aptaf bueem',
 'faq' => 'NEB',
@@ -847,8 +846,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',
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..e240157 100644 (file)
@@ -10,6 +10,7 @@
  * @author Cekli829
  * @author Don Alessandro
  * @author Emperyan
+ * @author Erdemaslancan
  * @author Gulmammad
  * @author Kaganer
  * @author PPerviz
@@ -222,7 +223,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,7 +473,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.",
+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.",
 'welcomecreation' => '== $1, xoş gəlmişsiniz! ==
 Hesabınız yaradıldı.
 [[Special:Preferences|{{SITENAME}} nizamlamalarınızı]] dəyişdirməyi unutmayın.',
@@ -730,6 +730,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 +926,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:',
@@ -2992,6 +2993,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.',
index 097eb64..80c8530 100644 (file)
@@ -208,7 +208,6 @@ $messages = array(
 'qbbrowse' => 'Байҡарға',
 'qbedit' => 'Үҙгәртергә',
 'qbpageoptions' => 'Был бит',
-'qbpageinfo' => 'Бит тураһында мәғлүмәттәр',
 'qbmyoptions' => 'Биттәрем',
 'qbspecialpages' => 'Махсус биттәр',
 'faq' => 'ЙБҺ',
@@ -323,6 +322,7 @@ $1',
 'versionrequiredtext' => 'Был бит менән эшләү өсөн MediaWiki-ның $1 версияһы кәрәк. [[Special:Version|Ҡулланылған версия тураһында мәғлүмәт битен]] ҡара.',
 
 'ok' => 'Тамам',
+'pagetitle' => '{{SITENAME}} проектынан',
 'retrievedfrom' => 'Сығанағы — «$1»',
 'youhavenewmessages' => 'Яңы $1 бар ($2).',
 'newmessageslink' => 'яңы хәбәр',
@@ -472,7 +472,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Һеҙ иҫәп яҙыуығыҙҙан сыҡтығыҙ.'''
 
-Һеҙ {{SITENAME}} проектында аноним рәүештә дауам итә йәки [[Special:UserLogin|яңынан таныла]] алаһығыҙ (үҙ йәки башҡа исем менән).
+Һеҙ {{SITENAME}} проектында аноним рәүештә дауам итә йәки <span class='plainlinks'>[$1 яңынан таныла]</span> алаһығыҙ (үҙ йәки башҡа исем менән).
 Ҡайһы бер биттәр һеҙ системала танылған һымаҡ күренергә мөмкин, уны бөтөрөү өсөн браузер кэшын таҙартығыҙ.",
 'welcomecreation' => '== Рәхим итегеҙ, $1! ==
 Иҫәп яҙыуығыҙ яһалды.
@@ -866,7 +866,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 +1078,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' => 'Бар исем арауыҡтарында эҙләргә',
@@ -2707,7 +2705,6 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 # JavaScriptTest
 'javascripttest' => '
 JavaScript тикшереү',
-'javascripttest-disabled' => 'Был мөмкинлек был Википроектта ғәмәлгә индерелмәгән.',
 'javascripttest-title' => '$1 тикшеренеү үткәрелә',
 'javascripttest-pagetext-noframework' => 'Был бит JavaScript тикшеренеүҙәре үткәреү өсөн  резервланған.',
 'javascripttest-pagetext-unknownframework' => 'Билдәһеҙ тикшеренеүҙәр мөхитнамәһе "$1".',
@@ -3668,6 +3665,10 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'feedback-bugcheck' => 'Шәп! Тик [$1 билдәле хаталар] исемлегендә оҡшаш белдереүҙең булмауына иғтибар итегеҙ.',
 'feedback-bugnew' => 'Тикшерҙем. Яңы хата тураһында белдерергә',
 
+# Search suggestions
+'searchsuggest-search' => 'Эҙләү',
+'searchsuggest-containing' => 'эстәлегендә...',
+
 # API errors
 'api-error-badaccess-groups' => 'Һеҙгә был викиға файлдар күсереү рөхсәт ителмәй',
 'api-error-badtoken' => 'Эске хата: дөрөҫ булмаған токен',
index 431332b..7aff876 100644 (file)
@@ -413,7 +413,7 @@ $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! ==
 
@@ -688,8 +688,6 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 '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',
 'searchall' => 'olle',
 'showingresultsheader' => "{{PLURAL:$5|Ergebnis '''$1''' voh '''$3'''|Ergebniss '''$1–$2''' voh '''$3'''}} fyr '''$4'''",
@@ -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..f33e04f 100644 (file)
@@ -274,7 +274,6 @@ $messages = array(
 'qbbrowse' => 'بروز',
 'qbedit' => 'اصلاح',
 'qbpageoptions' => 'صفحه',
-'qbpageinfo' => 'متن',
 'qbmyoptions' => 'منی صفحات',
 'qbspecialpages' => 'حاصین صفحات',
 'faq' => 'ب.ج.س',
@@ -982,8 +981,6 @@ $1",
 'search-interwiki-caption' => 'پروژه آن گوهار',
 'search-interwiki-default' => '$1 نتایج:',
 'search-interwiki-more' => '(گیشتر)',
-'search-mwsuggest-enabled' => 'گون پیشنهاد',
-'search-mwsuggest-disabled' => 'هچ پیشنهاد',
 'search-relatedarticle' => 'مربوطین',
 'mwsuggest-disable' => 'پیشنهادات آژاکسیء غیر فعال کن',
 'searcheverything-enable' => 'گردگ ته کل فضانامان',
index 300f137..22cb145 100644 (file)
@@ -242,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)',
@@ -506,7 +505,7 @@ 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.
@@ -1130,8 +1129,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',
@@ -2632,7 +2629,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".',
index 69f2853..ad64f05 100644 (file)
@@ -231,7 +231,6 @@ $messages = array(
 'qbbrowse' => 'Выбраць',
 'qbedit' => 'Правіць',
 'qbpageoptions' => 'Гэтая старонка',
-'qbpageinfo' => 'Кантэкст',
 'qbmyoptions' => 'Свае старонкі',
 'qbspecialpages' => 'Адмысловыя старонкі',
 'faq' => 'ЧАПЫ',
@@ -481,7 +480,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Вы выйшлі з сістэмы.'''
 
-Можна працягваць працу на {{SITENAME}} ананімна, або можна [[Special:UserLogin|ўвайсці ў сістэму ізноў]], пад тым самым або пад іншым удзельніцкім імем. Заўважце, што некаторыя старонкі могуць паказвацца так, быццам вы яшчэ не выйшлі; у такім разе трэба ачысціць кэш вашага браўзера.",
+Можна працягваць працу на {{SITENAME}} ананімна, або можна <span class='plainlinks'>[$1 ўвайсці ў сістэму ізноў]</span>, пад тым самым або пад іншым удзельніцкім імем. Заўважце, што некаторыя старонкі могуць паказвацца так, быццам вы яшчэ не выйшлі; у такім разе трэба ачысціць кэш вашага браўзера.",
 'welcomecreation' => '== Вітаем, $1! == Ваш  рахунак быў створаны. Не забудзьцеся дапасаваць свае [[Special:Preferences|{{SITENAME}} настáўленні]].',
 'yourname' => 'Імя ўдзельніка',
 'yourpassword' => 'Пароль',
@@ -1052,8 +1051,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' => 'Пошук ва ўсіх прасторах назваў',
@@ -2605,7 +2602,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript-тэсты',
-'javascripttest-disabled' => 'Гэта функцыя выключаная.',
 'javascripttest-title' => 'Праводзіцца тэставанне $1',
 'javascripttest-pagetext-noframework' => 'Гэта старонка зарэзервавана для запуску тэстаў JavaScript',
 'javascripttest-pagetext-unknownframework' => 'Невядомая бібліятэка тэставання «$1».',
@@ -3551,6 +3547,10 @@ MediaWiki распаўсюджваецца, спадзеючыся на прыд
 'feedback-bugcheck' => 'Выдатна! Толькі праверце, што ў спісе [$1 вядомых памылак] яе няма падобнага запісу.',
 'feedback-bugnew' => 'Я праверыў. Паведаміць пра новую памылку',
 
+# Search suggestions
+'searchsuggest-search' => 'Знайсці',
+'searchsuggest-containing' => 'змяшчае...',
+
 # API errors
 'api-error-badaccess-groups' => 'У Вас няма дазволу загружаць файлы ў гэтую вікі.',
 'api-error-badtoken' => 'Унутраная памылка: няслушны ключ.',
index a4cc8e0..650c34c 100644 (file)
@@ -399,7 +399,6 @@ $messages = array(
 'qbbrowse' => 'Праглядзець',
 'qbedit' => 'Рэдагаваць',
 'qbpageoptions' => 'Гэтая старонка',
-'qbpageinfo' => 'Інфармацыя пра старонку',
 'qbmyoptions' => 'Мае старонкі',
 'qbspecialpages' => 'Спэцыяльныя старонкі',
 'faq' => 'Частыя пытаньні',
@@ -412,7 +411,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' => 'Паказаць гісторыю',
@@ -423,7 +422,7 @@ $messages = array(
 'variants' => 'Варыянты',
 
 'errorpagetitle' => 'Памылка',
-'returnto' => 'Вярнуцца да старонкі $1.',
+'returnto' => 'Вярнуцца да старонкі «$1».',
 'tagline' => 'Зьвесткі з {{GRAMMAR:родны|{{SITENAME}}}}',
 'help' => 'Дапамога',
 'search' => 'Пошук',
@@ -662,7 +661,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Вы выйшлі з сыстэмы.'''
 
-Вы можаце працягваць працу ў {{GRAMMAR:месны|{{SITENAME}}}} ананімна, альбо можаце [[Special:UserLogin|ўвайсьці ў сыстэму]] як той жа альбо іншы ўдзельнік.
+Вы можаце працягваць працу ў {{GRAMMAR:месны|{{SITENAME}}}} ананімна, альбо можаце <span class='plainlinks'>[$1 ўвайсьці ў сыстэму]</span> як той жа альбо іншы ўдзельнік.
 Некаторыя старонкі могуць паказвацца, быццам Вы ўсё яшчэ ў сыстэме. Каб гэтага пазьбегнуць, трэба ачысьціць кэш браўзэра.",
 'welcomecreation' => '== Вітаем, $1! ==
 Ваш рахунак быў створаны.
@@ -1023,6 +1022,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' => 'Папярэджаньне: гэтая старонка ўтрымлівае зашмат працаёмістых зваротаў да функцыяў парсэра.
@@ -1279,8 +1287,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' => 'Шукаць ва ўсіх прасторах назваў',
@@ -1927,7 +1933,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',
@@ -2336,7 +2342,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' => 'журнал выдаленьняў',
@@ -2475,7 +2481,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|журнал выдаленьняў]] для прагляду апошніх выдаленьняў і аднаўненьняў.",
@@ -2775,6 +2782,7 @@ $1',
 'immobile-target-namespace-iw' => 'Інтэрвікі-спасылка — няслушная назва для пераносу старонкі.',
 'immobile-source-page' => 'Гэтую старонку нельга пераносіць.',
 'immobile-target-page' => 'Немагчыма перанесьці старонку пад гэтую назву.',
+'bad-target-model' => 'Выніковая старонка выкарыстоўвае іншы тып зьместу. Немагчыма пераўтварыць $1 у $2.',
 'imagenocrossnamespace' => 'Нельга перанесьці файл у ня-файлавую прастору назваў',
 'nonfile-cannot-move-to-file' => 'Нельга перанесьці ня файл у прастору назваў файлаў',
 'imagetypemismatch' => 'Новае пашырэньне файла не адпавядае яго тыпу',
@@ -2905,7 +2913,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Тэставаньне JavaScript',
-'javascripttest-disabled' => 'Гэтая функцыя не была ўключаная ў гэтай вікі.',
 'javascripttest-title' => 'Праводзіцца тэставаньне $1',
 'javascripttest-pagetext-noframework' => 'Гэтая старонка трымаецца для правядзеньня тэстаў JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Невядомая бібліятэка тэставаньня «$1».',
@@ -3012,6 +3019,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Інфармацыя пра «$1»',
+'pageinfo-not-current' => 'Інфармацыя паказываецца толькі для бягучай вэрсіі.',
 'pageinfo-header-basic' => 'Асноўныя зьвесткі',
 'pageinfo-header-edits' => 'Рэдагаваньні',
 'pageinfo-header-restrictions' => 'Абарона старонкі',
@@ -3036,10 +3044,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' => 'Клясычнае',
@@ -3616,6 +3631,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[Улучэньне інтэрвікі было адключанае]',
 'scarytranscludefailed' => '[Памылка атрыманьня шаблёну $1]',
+'scarytranscludefailed-httpstatus' => '[Памылка атрыманьня шаблёну $1: HTTP $2]',
 'scarytranscludetoolong' => '[Занадта даўгі URL-адрас]',
 
 # Delete conflict
@@ -3668,6 +3684,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' => 'Загрузка…',
@@ -3749,6 +3770,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' => 'Шлях да файла',
@@ -3899,6 +3922,10 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'feedback-bugcheck' => 'Выдатна! Толькі праверце, магчыма гэтыя памылкі ўжо [$1 вядомыя].',
 'feedback-bugnew' => 'Я праверыў. Гэта новая памылка',
 
+# Search suggestions
+'searchsuggest-search' => 'Пошук',
+'searchsuggest-containing' => 'утрымлівае...',
+
 # API errors
 'api-error-badaccess-groups' => 'У Вас няма дазволу загружаць файлы ў гэтую вікі.',
 'api-error-badtoken' => 'Унутраная памылка: няслушны ключ.',
index e8aec2e..f482ac3 100644 (file)
@@ -383,7 +383,6 @@ $messages = array(
 'qbbrowse' => 'Избор',
 'qbedit' => 'Редактиране',
 'qbpageoptions' => 'Тази страница',
-'qbpageinfo' => 'Информация за страницата',
 'qbmyoptions' => 'Моите страници',
 'qbspecialpages' => 'Специални страници',
 'faq' => 'ЧЗВ',
@@ -635,7 +634,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Излязохте от системата.'''
 
-Можете да продължите да използвате {{SITENAME}} анонимно или да [[Special:UserLogin|влезете отново]] като друг потребител.
+Можете да продължите да използвате {{SITENAME}} анонимно или да <span class='plainlinks'>[$1 влезете отново]</span> като друг потребител.
 Обърнете внимание, че някои страници все още ще се показват така, сякаш сте влезли, докато не изтриете кеш-паметта на браузъра.",
 'welcomecreation' => '== Добре дошли, $1! ==
 
@@ -1229,8 +1228,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' => 'Търсене във всички именни пространства',
@@ -2750,7 +2747,6 @@ $1',
 'import-logentry-interwiki-detail' => '{{PLURAL:$1|една версия|$1 версии}} на $2 бяха внесени',
 
 # JavaScriptTest
-'javascripttest-disabled' => 'Тази функционалност не е активирана в това уики.',
 'javascripttest-pagetext-noframework' => 'Тази страница е запазена за изпълнение на Джаваскрипт тестове.',
 'javascripttest-qunit-intro' => 'Вижте [$1 тестовата документация] на mediawiki.org.',
 
@@ -3643,6 +3639,9 @@ MediaWiki се разпространява с надеждата, че ще б
 'feedback-thanks' => 'Благодарности! Вашата обратна информация е публикувана на страницата „[$2  $1]“.',
 'feedback-close' => 'Готово',
 
+# Search suggestions
+'searchsuggest-search' => 'Търсене',
+
 # API errors
 'api-error-badaccess-groups' => 'Нямате необходимите права, за да качвате файлове в това уики.',
 'api-error-badtoken' => 'Вътрешна грешка: неправилен маркер.',
index 577d2e2..4720033 100644 (file)
@@ -422,8 +422,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' => 'सभन सन्दर्भ में खोजीं',
index 1e02306..094e2ac 100644 (file)
@@ -459,8 +459,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' => 'सभन सन्दर्भ में खोजीं',
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..6d72aae 100644 (file)
@@ -288,7 +288,6 @@ $messages = array(
 'qbbrowse' => 'Tangadahi',
 'qbedit' => 'Babak',
 'qbpageoptions' => 'Tungkaran ini',
-'qbpageinfo' => 'Naskah aluran',
 'qbmyoptions' => 'Tungkaran ulun',
 'qbspecialpages' => 'Tungkaran istimiwa',
 'faq' => 'FAQ',
@@ -540,7 +539,7 @@ 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.
@@ -1148,8 +1147,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',
@@ -3690,6 +3687,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 c1e2685..c7c2654 100644 (file)
@@ -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' => 'ইতিহাস',
@@ -475,7 +474,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''আপনি এইমাত্র আপনার একাউন্ট থেকে প্রস্থান করেছেন।'''
 
-এ পরিস্থিতিতে আপনি বেনামে {{SITENAME}} ব্যবহার করতে পারেন, কিংবা একই বা পৃথক নামে [[Special:UserLogin|আবার প্রবেশ করতে]] পারেন।
+এ পরিস্থিতিতে আপনি বেনামে {{SITENAME}} ব্যবহার করতে পারেন, কিংবা একই বা পৃথক নামে <span class='plainlinks'>[$1 আবার প্রবেশ করতে]</span> পারেন।
 লক্ষ্য করুন যে, এর কোন কোন পাতা এখনও এমনভাবে দেখাতে পারে যাতে মনে হবে আপনি আগের অবস্থাতেই আছেন। এক্ষেত্রে আপনাকে আপনার ব্রাওজারের ক্যাশ পরিষ্কার (clear browser cache) করে নিতে হবে।",
 'welcomecreation' => '== স্বাগতম $1! ==
 আপনার অ্যাকাউন্ট তৈরী হয়েছে।
@@ -826,6 +825,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' => "'''সতর্ক হোন:''' এই পাতাটি অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল রয়েছে।
@@ -1082,8 +1090,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' => 'সকল নামস্থানে অনুসন্ধান করো',
@@ -1639,6 +1645,9 @@ $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' => 'ইউআরএল এর কোয়েরি স্ট্রিংটি সঠিক নয়।',
 
@@ -1698,19 +1707,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' => 'দà§\81à¦\83à¦\96িত à¦\86পনি à¦\8fà¦\87 à¦\9bবিটি প্রতিস্থাপন করতে পারবেন না।',
+'upload-disallowed-here' => 'à¦\86পনি à¦\8fà¦\87 à¦«à¦¾à¦\87লটি প্রতিস্থাপন করতে পারবেন না।',
 
 # File reversion
 'filerevert' => '$1 পূর্বাবস্থায় ফেরত নিন',
@@ -1781,6 +1799,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' => 'সক্রিয় ব্যবহারকারী',
@@ -1837,6 +1856,8 @@ $1',
 'wantedpages' => 'বাঞ্ছনীয় পাতাগুলি',
 'wantedpages-badtitle' => 'ফলাফলে ভুল শিরনাম: $1',
 'wantedfiles' => 'আবশ্যিক ফাইলগুলো',
+'wantedfiletext-cat' => 'নিচের ফাইলগুলো ব্যবহৃত হচ্ছে কিন্তু এগুলো অপসারিত হয়েছে। অন্যান্য রিপোজিটরী থেকে ব্যবহৃত ফাইলগুলো এভাবে প্রদর্শিত হতে পারে। এই ধরনের কোন ফাইল খুজে পেলে <del>অপসারণ করুন</del>। এছাড়া অপসারিত হয়েছে এমন ছবির সংযোগ রয়েছে এমন পাতাসমূহের লিংক পাওয়া যাবে এখানে [[:$1]]।',
+'wantedfiletext-nocat' => 'নিচের ফাইলগুলো ব্যবহৃত হচ্ছে কিন্তু এগুলো অপসারিত হয়েছে। অন্যান্য রিপোজিটরী থেকে ব্যবহৃত ফাইলগুলো এভাবে প্রদর্শিত হতে পারে। এই ধরনের ভূলগুলো শিঘ্রই <del>অপসারিত হবে</del>।',
 'wantedtemplates' => 'আবশ্যিক টেম্পলেটগুলো',
 'mostlinked' => 'যেসব পাতার প্রতি সবচেয়ে বেশি সংযোগ আছে',
 'mostlinkedcategories' => 'যেসব বিষয়শ্রেণীর প্রতি সবচেয়ে বেশি সংযোগ আছে',
@@ -1968,6 +1989,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' => 'দল',
@@ -2275,7 +2298,9 @@ $1',
 # Namespace form on various pages
 'namespace' => 'নামস্থান:',
 'invert' => 'ব্যুত্ক্রমে নির্বাচন',
+'tooltip-invert' => 'যে সকল নামস্থানের পাতাগুলোর পরিবর্তনসমূহর দেখতে চাচ্ছেন না সেগুলোর নামের পাশে টিক দিন',
 'namespace_association' => 'সংশ্লিষ্ট নামস্থান',
+'tooltip-namespace_association' => 'এখানে টিক দেয়ার মাধ্যমে সংশ্লিষ্ট নামস্থান এবং আলাপপাতাসমূহ অন্তর্ভুক্ত করছেন',
 'blanknamespace' => '(প্রধান)',
 
 # Contributions
@@ -2649,7 +2674,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'জাভাস্ক্রিপ্ট পরীক্ষা',
-'javascripttest-disabled' => 'এই উইকিতে নির্ধারিত অপশনটি চালু নেই।',
 'javascripttest-title' => '$1 পরীক্ষা চলছে',
 'javascripttest-pagetext-noframework' => 'এই পাতাটি জাভাস্ক্রিপ্ট পরীক্ষার জন্য সংরক্ষিত।',
 'javascripttest-pagetext-unknownframework' => 'পরীক্ষার অজানা ফ্রেমওয়ার্ক "$1"।',
@@ -2777,7 +2801,6 @@ $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)',
@@ -3577,6 +3600,10 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'feedback-bugcheck' => 'উত্তম! যাচাই করুন যে এই [$1  জানা বাগের] কোন একটি কিনা।',
 'feedback-bugnew' => 'আমি যাচাই করেছি। নতুন বাগ নিবন্ধন করুন।',
 
+# Search suggestions
+'searchsuggest-search' => 'অনুসন্ধান',
+'searchsuggest-containing' => 'যা আছে...',
+
 # API errors
 'api-error-badaccess-groups' => 'আপনার এই উইকিতে ফাইল আপলোডের অনুমতি নেই।',
 'api-error-badtoken' => 'অভ্যন্তরীণ ত্রুটি: খারাপ টোকেন।',
index 281dbdd..af935e9 100644 (file)
@@ -456,8 +456,6 @@ $messages = array(
 'search-interwiki-caption' => 'སྲིང་མོའི་ལས་འཆར།',
 'search-interwiki-default' => '$1ལས་རྙེད་པ།',
 'search-interwiki-more' => '(དེ་ལས་མང་བ།)',
-'search-mwsuggest-enabled' => 'གྲོས་འཆར་དང་བཅས།',
-'search-mwsuggest-disabled' => 'གྲོས་འཆར་མི་དགོས།',
 'search-relatedarticle' => 'འབྲེལ་ཡོད།',
 'searchall' => 'ཚང་མ།',
 'powersearch' => 'ཞིབ་ཏུ་འཚོལ་བ།',
index 65e0217..1cfff22 100644 (file)
@@ -434,7 +434,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''তি খানি আগে তর একাউন্টহাত্ত নিকুরিসত।'''
 
-এ পরিস্থিতিত তি বেনাঙল {{SITENAME}} ব্যবহার করানি পারর, নাইলে আরাক নাঙল [[Special:UserLogin|বারো হমানি]] পারর।
+এ পরিস্থিতিত তি বেনাঙল {{SITENAME}} ব্যবহার করানি পারর, নাইলে আরাক নাঙল <span class='plainlinks'>[$1 বারো হমানি]</span> পারর।
 খিয়াল থ, কোন কোন পাতা তি আগর অংতাত আসত বুলিয়া দেখা দিতে পারে। অসারে ইলে তি ব্রাওজারর ক্যাশ সেঙকরে বেলা (clear browser cache)।",
 'welcomecreation' => '==সম্ভাষা, $1! ==
 তর একাউন্টহান হঙিল। তর [[Special:Preferences|{{SITENAME}} পছনহান]] সিলানি না পাহুরিস।',
@@ -865,8 +865,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' => 'হাব্বি নাঙথাকে বিসারা',
@@ -1737,4 +1735,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'revdelete-unrestricted' => 'ডান্ডিকরেকুরাগরাঙ সীমাবদ্ধতাহানি নেইকর',
 'newuserlog-byemail' => 'ই-মেইলর মা পেঠাদিয়াসি পাসৱার্ডগ',
 
+# Search suggestions
+'searchsuggest-search' => 'বিসারা',
+'searchsuggest-containing' => 'আসেতা...',
+
 );
index c6a1999..390c926 100644 (file)
@@ -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',
@@ -583,7 +582,7 @@ 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! ==
 
@@ -1193,8 +1192,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',
@@ -2811,7 +2808,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.',
@@ -2972,7 +2968,6 @@ 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)",
@@ -3846,6 +3841,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..ff0a8a4 100644 (file)
@@ -305,7 +305,7 @@ $messages = array(
 'tog-nocache' => 'Onemogući keširanje stranica u pregledniku',
 'tog-enotifwatchlistpages' => 'Pošalji mi e-poštu kad se promijene stranice',
 '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:',
@@ -425,7 +425,6 @@ $messages = array(
 'qbbrowse' => 'Prelistajte',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Opcije stranice',
-'qbpageinfo' => 'Informacije o stranici',
 'qbmyoptions' => 'Moje opcije',
 'qbspecialpages' => 'Posebne stranice',
 'faq' => 'ČPP',
@@ -544,6 +543,8 @@ $1',
 'youhavenewmessages' => 'Imate $1 ($2).',
 'newmessageslink' => 'novih poruka',
 'newmessagesdifflink' => 'posljednja promjena',
+'youhavenewmessagesfromusers' => 'Imate $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika}} ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|novu poruku|nove poruke}}',
 'youhavenewmessagesmulti' => 'Imate nove poruke na $1',
 'editsection' => 'uredi',
 'editsection-brackets' => '[$1]',
@@ -653,7 +654,8 @@ 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.",
@@ -667,6 +669,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,7 +679,7 @@ 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.
@@ -687,6 +690,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 +942,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 +952,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 +1054,10 @@ Izgleda da je obrisana.',
 Izgleda da već postoji.',
 'defaultmessagetext' => 'Uobičajeni tekst poruke',
 
+# Content models
+'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 +1307,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',
@@ -1398,7 +1403,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',
@@ -2137,6 +2142,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 +2214,7 @@ 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-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.',
@@ -2895,7 +2904,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".',
@@ -3925,6 +3933,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.',
@@ -3966,6 +3978,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..c4003b0 100644 (file)
@@ -16,263 +16,263 @@ $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 665ed84..ae9cfd7 100644 (file)
@@ -340,7 +340,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 +352,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",
@@ -430,7 +429,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',
@@ -573,7 +572,8 @@ Consulta: $2',
 'protectedpagetext' => 'Aquesta pàgina està protegida per evitar 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.",
+'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. 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.",
 '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»:
@@ -599,7 +599,7 @@ 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! ==
 
@@ -853,12 +853,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 guardar possiblement necessites refrescar el teu cache per poder veure els canvis.
+* '''Firefox / Safari:''' pressiona ''Shift'' mentre cliques el botó ''Actualitzar'', o pressiona ''Ctrl+F5'' o ''Ctrl+R'' (''⌘+R'' a Mac)
+* '''Google Chrome:''' pressiona ''Ctrl+Shift+R'' (''⌘+Shift+R'' a Mac)
+* '''Internet Explorer:''' pressiona la tecla ''Ctrl'' mentre cliques a ''Actualitzar'' o pressiona ''Ctrl+F5''
+* '''Opera:''' buida la memòria cau (cache) ''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.'''
@@ -1008,8 +1007,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,7 +1109,8 @@ 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-reasonotherlist' => 'Altres raons',
@@ -1208,8 +1208,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',
@@ -2122,6 +2120,8 @@ 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.",
@@ -2379,7 +2379,8 @@ 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.",
@@ -2810,7 +2811,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 +2842,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 +2883,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 +2923,17 @@ 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-header-basic' => 'Informació bàsica',
+'pageinfo-header-edits' => "Historial d'edicions",
+'pageinfo-header-restrictions' => 'Protecció de pàgina',
 '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-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",
 
 # Skin names
 'skinname-standard' => 'Clàssic',
@@ -3777,6 +3783,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.',
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 17545b0..94a9203 100644 (file)
@@ -756,8 +756,6 @@ $1',
 'search-interwiki-caption' => 'Гергара кхолламаш',
 'search-interwiki-default' => '$1 хилам.:',
 'search-interwiki-more' => '(кхин)',
-'search-mwsuggest-enabled' => 'хьехаршца',
-'search-mwsuggest-disabled' => 'хьехар доцуш',
 'searcheverything-enable' => 'Массо цIера анахь лахар',
 'searchrelated' => 'хlоттаделларг',
 'searchall' => 'массо',
index bbdf0ac..62aaf29 100644 (file)
@@ -443,7 +443,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.",
+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.",
 'welcomecreation' => '== Maayong pag-abot, $1! ==
 Nahimo na ang imong akawnt.
 Ayaw kalimot sa pag-usab sa imong [[Special:Preferences|{{SITENAME}} mga preperensiya]].',
@@ -724,8 +724,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.",
index 99d4116..f05a9e0 100644 (file)
@@ -644,8 +644,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..eebf07c 100644 (file)
@@ -292,7 +292,6 @@ $messages = array(
 'qbbrowse' => 'بگه‌ڕێ',
 'qbedit' => 'دەستکاری',
 'qbpageoptions' => 'ئەم پەڕەیە',
-'qbpageinfo' => 'زانیاریی په‌ڕه‌',
 'qbmyoptions' => 'پەڕەکانم',
 'qbspecialpages' => 'پەڕە تایبەتەکان',
 'faq' => 'پرسیار و وەڵام (FAQ)',
@@ -546,7 +545,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ئێستا تۆ لە ھەژمارەکەت ھاتوویتە دەرەوە.'''
 
-دەتوانی بە شێوەی بێناو درێژە بدەی بە بەرکارھێنانی {{SITENAME}}، یان دەتوانی [[Special:UserLogin|دیسانەوە بچیتەوە ژوورەوە]] ھەر بەو ناوە یان بە ناوی بەکارھێنەرییەکی جیاوازەوە.
+دەتوانی بە شێوەی بێناو درێژە بدەی بە بەرکارھێنانی {{SITENAME}}، یان دەتوانی <span class='plainlinks'>[$1 دیسانەوە بچیتەوە ژوورەوە]</span> ھەر بەو ناوە یان بە ناوی بەکارھێنەرییەکی جیاوازەوە.
 ئاگادار بە کە ھەتا کاتێک کە کەشی وێبگەڕەکەت دەسڕیتەوە، سەرەڕای چوونەدەرەوەی تۆ ھەندێک لە پەڕەکان ھەر بە شێوەیەک نیشان دەدرێن کە گوایە تۆ ھێشتا لە ژوورەوەیت.",
 'welcomecreation' => '== بەخێربێی، $1! ==
 ھەژمارەکەت دروست کرا.
@@ -1132,8 +1131,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' => 'لە ھەموو بۆشایی‌‌ناوەکان دا بگەڕێ',
@@ -2586,13 +2583,13 @@ $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}} لە $2',
 
 # 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' => 'دەرچوون',
@@ -3312,6 +3309,10 @@ $5
 'feedback-submit' => 'تێبینییەکان بنێرە',
 'feedback-close' => 'ئەنجام درا',
 
+# Search suggestions
+'searchsuggest-search' => 'گەڕان',
+'searchsuggest-containing' => 'بە لەبەرگرتنەوەی ...',
+
 # API errors
 'api-error-filename-tooshort' => 'ناوی پەڕگەکە زۆر کورتە.',
 'api-error-filetype-banned' => 'ئەم جۆرە پەڕگەیە قەدەغەیە.',
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..8f063a5 100644 (file)
@@ -408,7 +408,7 @@ 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.
@@ -591,8 +591,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 266a89f..0c3f017 100644 (file)
@@ -491,7 +491,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Отурымны къапаттынъыз.'''
 
-Шимди {{SITENAME}} сайтыны аноним оларакъ къулланып оласынъыз, я да янъыдан [[Special:UserLogin|отурым ачып]] оласынъыз (истер айны къулланыджы адынен, истер башкъа бир къулланыджы адынен). Web браузеринъиз кэшини темизлегендже базы саифелер санки аля даа отурымынъыз ачыкъ экен киби корюнип олур.",
+Шимди {{SITENAME}} сайтыны аноним оларакъ къулланып оласынъыз, я да янъыдан <span class='plainlinks'>[$1 отурым ачып]</span> оласынъыз (истер айны къулланыджы адынен, истер башкъа бир къулланыджы адынен). Web браузеринъиз кэшини темизлегендже базы саифелер санки аля даа отурымынъыз ачыкъ экен киби корюнип олур.",
 'welcomecreation' => '== Хош кельдинъиз, $1! ==
 Эсабынъыз ачылды.
 Бу сайтнынъ [[Special:Preferences|сазламаларыны]] шахсынъызгъа коре денъиштирмеге унутманъыз.',
@@ -871,8 +871,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' => 'Бутюн исим фезаларында къыдыр',
@@ -2112,4 +2110,7 @@ $5
 # New logging system
 'newuserlog-byemail' => 'пароль e-mail вастасынен йиберильген',
 
+# Search suggestions
+'searchsuggest-containing' => 'ичинде бу олгъан...',
+
 );
index a8d1112..95bf434 100644 (file)
@@ -487,7 +487,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.",
+Ş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.",
 '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.',
@@ -868,8 +868,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',
@@ -2107,4 +2105,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..8ed6e83 100644 (file)
@@ -503,7 +503,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 +515,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',
@@ -764,7 +763,7 @@ 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.
@@ -1119,6 +1118,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 +1382,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 +1453,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.
@@ -2022,7 +2028,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',
@@ -2556,7 +2562,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]].",
@@ -2850,6 +2857,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 +2981,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 +3119,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 lze zobrazit jen pro aktuální verzi.',
 'pageinfo-header-basic' => 'Základní údaje',
 'pageinfo-header-edits' => 'Historie editací',
 'pageinfo-header-restrictions' => 'Zámek stránky',
@@ -3136,10 +3144,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ý',
@@ -3717,6 +3732,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
@@ -4049,6 +4065,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.',
index d6b834d..fc7eb7e 100644 (file)
@@ -354,7 +354,7 @@ 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é.
@@ -578,8 +578,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.",
index ce92abd..abecafc 100644 (file)
@@ -795,6 +795,9 @@ $messages = array(
 'logentry-move-move-noredirect' => '$1 нарєчє страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖ бєꙁ прѣнаправлєниꙗ сътворѥниꙗ',
 'logentry-newusers-create' => '$1 сътворихъ польꙃєватєльско мѣсто',
 
+# Search suggestions
+'searchsuggest-containing' => 'сѥ дрьжащи···',
+
 # API errors
 'api-error-unknownerror' => 'нєвѣдома блаꙁна : ⁖ $1 ⁖',
 
index 8860d97..5c5ebf2 100644 (file)
@@ -261,7 +261,6 @@ $messages = array(
 'qbbrowse' => 'Pori',
 'qbedit' => 'Golygu',
 'qbpageoptions' => 'Y dudalen hon',
-'qbpageinfo' => 'Cyd-destun',
 'qbmyoptions' => 'Fy nhudalennau',
 'qbspecialpages' => 'Tudalennau arbennig',
 'faq' => 'Cwestiynau cyffredin',
@@ -522,7 +521,7 @@ 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.
@@ -1120,8 +1119,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',
@@ -2742,7 +2739,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".',
@@ -3702,6 +3698,9 @@ 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-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..11391ec 100644 (file)
@@ -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',
@@ -593,7 +592,7 @@ 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! ==
 
@@ -952,6 +951,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 parse $2 indhold for $1 model: $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 +1211,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',
@@ -2380,7 +2386,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.",
@@ -2667,6 +2674,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 +2799,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".',
@@ -2906,6 +2913,7 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 
 # Info page
 'pageinfo-title' => 'Information om "$1"',
+'pageinfo-not-current' => 'Oplysninger vises kun for den aktuelle version.',
 'pageinfo-header-basic' => 'Grundlæggende oplysninger',
 'pageinfo-header-edits' => 'Redigeringshistorik',
 'pageinfo-header-restrictions' => 'Sidebeskyttelse',
@@ -2930,10 +2938,10 @@ 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',
 
 # Skin names
 'skinname-standard' => 'Klassik',
@@ -3506,6 +3514,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
@@ -3777,6 +3786,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.',
index fce65ee..c2782be 100644 (file)
@@ -12,6 +12,7 @@
  * @author ChrisiPK
  * @author Church of emacs
  * @author DaSch
+ * @author Das Schäfchen
  * @author Duesentrieb
  * @author Filzstift
  * @author Geitost
@@ -451,7 +452,7 @@ $messages = array(
 
 'underline-always' => 'immer',
 'underline-never' => 'nie',
-'underline-default' => 'abhängig von Browsereinstellung',
+'underline-default' => 'abhängig von der Browsereinstellung',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Schriftart für den Text im Bearbeitungsfenster:',
@@ -547,10 +548,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
@@ -560,7 +560,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',
@@ -649,13 +649,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.',
@@ -786,12 +786,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.",
@@ -811,12 +811,12 @@ 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.',
+Dein Benutzerkonto wurde soeben eingerichtet.
+Vergiss nicht, deine [[Special:Preferences|Einstellungen]] für dieses Wiki anzupassen.',
 'yourname' => 'Benutzername:',
 'yourpassword' => 'Passwort:',
 'yourpasswordagain' => 'Passwort wiederholen:',
@@ -908,7 +908,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',
@@ -998,7 +998,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.',
@@ -1008,7 +1008,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
@@ -1017,7 +1017,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:
@@ -1105,7 +1105,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.
@@ -1165,6 +1165,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.
@@ -1188,7 +1197,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.',
@@ -1399,7 +1408,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',
@@ -1417,8 +1426,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',
@@ -1498,7 +1505,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:',
@@ -1807,7 +1814,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.',
@@ -1817,14 +1824,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',
@@ -1840,7 +1847,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>.
@@ -1940,7 +1947,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.',
@@ -1971,17 +1978,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.',
@@ -2009,11 +2016,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)',
@@ -2071,7 +2078,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“',
@@ -2143,7 +2150,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',
@@ -2506,9 +2513,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',
@@ -2603,7 +2610,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.",
@@ -2720,7 +2728,7 @@ 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',
@@ -2868,7 +2876,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.',
@@ -2901,6 +2909,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',
@@ -3027,7 +3036,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“.',
@@ -3043,14 +3051,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',
@@ -3068,7 +3076,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',
@@ -3167,6 +3175,7 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 
 # Info page
 'pageinfo-title' => 'Informationen zu „$1“',
+'pageinfo-not-current' => 'Diese Informationen können nur für die aktuelle Version angezeigt werden.',
 'pageinfo-header-basic' => 'Basisinformationen',
 'pageinfo-header-edits' => 'Bearbeitungsgeschichte',
 'pageinfo-header-restrictions' => 'Seitenschutz',
@@ -3192,10 +3201,17 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 '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-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' => 'Informationen zur Seite',
+'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',
@@ -3777,6 +3793,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
@@ -3824,7 +3841,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
@@ -4041,7 +4058,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',
@@ -4053,8 +4070,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',
@@ -4068,6 +4085,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.',
@@ -4086,7 +4107,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.',
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 6be2d14..7d6e3a6 100644 (file)
@@ -14,6 +14,7 @@
  * @author George Animal
  * @author Kaganer
  * @author Mirzali
+ * @author Olvörg
  * @author Reedy
  * @author Sahim
  * @author Xoser
@@ -358,50 +359,50 @@ $messages = array(
 
 # 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-default' => 'Qerar cıgeyraoği dest dero',
+'editfont-monospace' => 'Tipê nusteyê sabıtcagırewtoği',
+'editfont-sansserif' => 'Babetê Sans-serifi',
+'editfont-serif' => 'Tipê nusteyê serifi',
 
 # Dates
-'sunday' => 'Bazar',
+'sunday' => 'Kırê',
 'monday' => 'Berarek',
 'tuesday' => 'Telete',
 'wednesday' => 'Çeharşeme',
 'thursday' => 'Pancşeme',
 'friday' => 'Êne',
 'saturday' => 'Bahdê êni',
-'sun' => 'Baz',
-'mon' => 'Ber',
-'tue' => 'Tlt',
+'sun' => 'Krê',
+'mon' => 'Dış',
+'tue' => 'Sêş',
 'wed' => 'Çrş',
-'thu' => 'P',
+'thu' => 'Pşm',
 'fri' => 'Êne',
-'sat' => 'Bah',
+'sat' => 'Şem',
 'january' => 'Çele',
-'february' => 'Zemherı',
+'february' => 'Şıbate',
 'march' => 'Mert',
-'april' => 'Lisane',
-'may_long' => 'Gulan',
+'april' => 'Lizan',
+'may_long' => 'Gulane',
 'june' => 'Heziran',
-'july' => 'Paliyan',
+'july' => 'Temuze',
 'august' => 'Tebaxe',
-'september' => 'Kergan',
-'october' => 'Cıtan',
-'november' => 'Kelverdan',
-'december' => 'Vewran',
+'september' => 'Keşkelun',
+'october' => 'Tışrino Verên',
+'november' => 'Tışrino Peyên',
+'december' => 'Kanun',
 'january-gen' => 'Çele',
-'february-gen' => 'Zemherı',
-'march-gen' => 'Mert',
-'april-gen' => 'Lisan',
-'may-gen' => 'Gulan',
+'february-gen' => 'Şıbate',
+'march-gen' => 'Adar',
+'april-gen' => 'Nisane',
+'may-gen' => 'Gulane',
 'june-gen' => 'Heziran',
-'july-gen' => 'Paliyan',
+'july-gen' => 'Temuze',
 'august-gen' => 'Tebaxe',
-'september-gen' => 'Kergan',
-'october-gen' => 'Cıtan',
-'november-gen' => 'Kelverdan',
-'december-gen' => 'Vewran',
+'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',
@@ -440,11 +441,11 @@ $messages = array(
 
 'about' => 'Heqa',
 'article' => 'Wesiqe',
-'newwindow' => '(zerreyê teqeyê newey de beno a)',
+'newwindow' => '(zerreyê pençereyê newey de beno a)',
 'cancel' => 'Bıtexelne',
 'moredotdotdot' => 'Vêşêri...',
 'mypage' => 'Pela mı',
-'mytalk' => 'Verênayışê mı',
+'mytalk' => 'Werênayışê mı',
 'anontalk' => 'Pela werênayışê nê IPy',
 'navigation' => 'Geyrayış',
 'and' => '&#32;u',
@@ -454,7 +455,6 @@ $messages = array(
 'qbbrowse' => 'Rovete',
 'qbedit' => 'Bıvurne',
 'qbpageoptions' => 'Ena pele',
-'qbpageinfo' => 'Gıre',
 'qbmyoptions' => 'Pelê mı',
 'qbspecialpages' => 'Peley xısusi',
 'faq' => 'PZP (Persê ke zehf persiyenê)',
@@ -467,7 +467,7 @@ $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',
@@ -512,7 +512,7 @@ $messages = array(
 'personaltools' => 'Haletê şexsi',
 'postcomment' => 'Qısımo newe',
 'articlepage' => 'Pela zerreki bıvêne',
-'talk' => 'Werênayış',
+'talk' => 'Behse',
 'views' => 'Asayışi',
 'toolbox' => 'Haceti',
 'userpage' => 'Pela karberi bıvêne',
@@ -558,7 +558,7 @@ $1',
 'policy-url' => 'Project:Terzê hereketi',
 'portal' => 'Portalê şêlıgi',
 'portal-url' => 'Project:Portalê şêlıgi',
-'privacy' => 'Xısusiyeta nımıtin',
+'privacy' => 'Madeyê dızdiye',
 'privacypage' => 'Project:Xısusiyetê nımtışi',
 
 'badaccess' => 'Xeta mısadey',
@@ -722,7 +722,7 @@ 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! ==
 
@@ -903,8 +903,8 @@ Parola vêrdiye: $2',
 # Edit pages
 'summary' => 'Xulasa:',
 'subject' => 'Mewzu/serrêze:',
-'minoredit' => 'Eno yew vurnayışo qıckeko',
-'watchthis' => 'Ena perer temase ke',
+'minoredit' => 'Eno vurnayışo de qıckeko',
+'watchthis' => 'Ena pele seyr ke',
 'savearticle' => 'Pele qeyd ke',
 'preview' => 'Verqayt',
 'showpreview' => 'Verqayti bımocne',
@@ -1074,6 +1074,15 @@ 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.
@@ -1329,8 +1338,6 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 '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',
@@ -1370,7 +1377,7 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 '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',
@@ -1988,7 +1995,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',
@@ -2105,7 +2112,7 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 '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ê',
@@ -2305,8 +2312,8 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'usermessage-template' => 'MediaWiki:UserMessage',
 
 # Watchlist
-'watchlist' => 'lista mına seyr-kerdışi',
-'mywatchlist' => 'Listey taqiban',
+'watchlist' => 'Lista mına seyrkerdışi',
+'mywatchlist' => 'Lista mına 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.',
@@ -2528,7 +2535,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]].",
@@ -2563,7 +2571,7 @@ $1',
 # Contributions
 'contributions' => 'İştiraqê karberi',
 'contributions-title' => 'Dekerdenê karber de $1',
-'mycontris' => 'Dekerdeni',
+'mycontris' => 'Dekerdenê mı',
 'contribsub2' => 'Qandê $1 ($2)',
 'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
 'uctop' => '(top)',
@@ -2834,6 +2842,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ê',
@@ -2874,7 +2883,7 @@ ma vaci: qey pelê "[[{{MediaWiki:Mainpage}}]]i " [[{{#Special:Export}}/{{MediaW
 'allmessages' => 'Mesacê sistemi',
 'allmessagesname' => 'Name',
 'allmessagesdefault' => 'Hesıbyaye metnê mesaci',
-'allmessagescurrent' => 'nuşte yo ke Karyayo',
+'allmessagescurrent' => 'Metno ke karyayo',
 'allmessagestext' => 'na liste, listeya mesajê cayê nameyê wikimedya yo.
 eke şıma qayili paşt bıdi mahalli kerdışê wikimedyayi, kerem kerê pelê [//www.mediawiki.org/wiki/Localisation mahalli kerdışê wikimedyayi] u [//translatewiki.net translatewiki.net] ziyaret bıkerê.',
 'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages''' qefelnaye yo u ey ra '''{{ns:special}}:Allmessages''' karkerdışi re akerde niyo.",
@@ -2961,7 +2970,6 @@ dosyaya emaneti vindbiyo',
 
 # JavaScriptTest
 'javascripttest' => 'Cerbnayışê JavaScripti',
-'javascripttest-disabled' => 'Na kerdin, na wiki sero aktiv nêbiya.',
 '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.',
@@ -3582,6 +3590,7 @@ mw.loader.using( 'jquery.cookie', function() {
 
 # Info page
 'pageinfo-title' => 'Heq tê "$1"\'i',
+'pageinfo-not-current' => 'Melumat tenya qandê çımraviyarnayışê rocaney mocniyeno.',
 'pageinfo-header-basic' => 'Seron zanayış',
 'pageinfo-header-edits' => 'Vurnayışi verêni',
 'pageinfo-header-restrictions' => 'Xısusiyetê pela',
@@ -3596,6 +3605,7 @@ mw.loader.using( 'jquery.cookie', function() {
 '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',
@@ -3606,10 +3616,17 @@ mw.loader.using( 'jquery.cookie', function() {
 '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' => 'Malumatê perer',
+'pageinfo-redirectsto' => 'Hetanayışê cı',
+'pageinfo-redirectsto-info' => 'Zanışe',
+'pageinfo-contentpage' => 'Perra zerreki hesbêna',
+'pageinfo-contentpage-yes' => 'E',
+'pageinfo-protect-cascading' => 'Starın merwanan ra tiya',
+'pageinfo-protect-cascading-yes' => 'E',
+'pageinfo-protect-cascading-from' => 'Starın merwanan ra',
 
 # Skin names
 'skinname-standard' => 'Klasik',
@@ -3686,7 +3703,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',
 
@@ -4296,6 +4313,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
@@ -4410,7 +4428,7 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'vurnayışanê eleqadari bıvin',
-'watchlisttools-edit' => 'listey taqiban bıvinê u bıvurnê',
+'watchlisttools-edit' => 'Lista seyrkerdışi bıvênên u bıvurnên',
 'watchlisttools-raw' => 'Listeyê seyr-kerdışi bıvin',
 
 # Iranian month names
@@ -4664,6 +4682,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.',
index 2278e13..a30a6a0 100644 (file)
@@ -303,7 +303,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 +315,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',
@@ -562,7 +561,7 @@ 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! ==
 
@@ -898,6 +897,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 +1159,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ś',
@@ -1797,7 +1803,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',
@@ -2326,7 +2332,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.",
@@ -2616,6 +2623,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 +2748,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 +2860,7 @@ W zespominanju dajo se pśicyna pódaś.',
 
 # Info page
 'pageinfo-title' => 'Informacije za bok "$1"',
+'pageinfo-not-current' => 'Informacije daju se jano za aktualnu wersiju zwobrazniś.',
 'pageinfo-header-basic' => 'Zakładne informacije',
 'pageinfo-header-edits' => 'Historiju wobźěłaś',
 'pageinfo-header-restrictions' => 'Šćit boka',
@@ -2878,10 +2886,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',
@@ -3450,6 +3465,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
@@ -3731,6 +3747,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',
index 58e5be0..c184f3d 100644 (file)
@@ -425,7 +425,7 @@ 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.
@@ -965,8 +965,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..3c31517 100644 (file)
@@ -497,7 +497,6 @@ $messages = array(
 'qbbrowse' => 'Περιήγηση',
 'qbedit' => 'Επεξεργασία',
 'qbpageoptions' => 'Αυτή η σελίδα',
-'qbpageinfo' => 'Συμφραζόμενα',
 'qbmyoptions' => 'Οι σελίδες μου',
 'qbspecialpages' => 'Σελίδες λειτουργιών',
 'faq' => 'Συχνές ερωτήσεις (FAQ)',
@@ -751,7 +750,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Έχετε αποσυνδεθεί.'''
 
-Μπορείτε να παραμείνετε στο {{SITENAME}} ανώνυμα, ή μπορείτε [[Special:UserLogin|να συνδεθείτε ξανά]] με το ίδιο ή με διαφορετικό (εάν έχετε) όνομα χρήστη.
+Μπορείτε να παραμείνετε στο {{SITENAME}} ανώνυμα, ή μπορείτε <span class='plainlinks'>[$1 να συνδεθείτε ξανά]</span> με το ίδιο ή με διαφορετικό (εάν έχετε) όνομα χρήστη.
 Έχετε υπόψη σας πως αρκετές σελίδες θα συνεχίσουν να εμφανίζονται κανονικά, σαν να μην έχετε αποσυνδεθεί, μέχρι να καθαρίσετε τη λανθάνουσα μνήμη του φυλλομετρητή σας.",
 'welcomecreation' => '== Καλώς ήλθατε, $1! ==
 Ο λογαριασμός σας έχει δημιουργηθεί.
@@ -1334,8 +1333,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' => 'Αναζήτηση σε όλες τις περιοχές ονομάτων',
@@ -2924,7 +2921,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Δοκιμή JavaScript',
-'javascripttest-disabled' => 'Αυτή η λειτουργία έχει απενεργοποιηθεί.',
 'javascripttest-title' => 'Εκτελούνται  $1  δοκιμές',
 'javascripttest-pagetext-noframework' => 'Αυτή η σελίδα είναι δεσμευμένη για την εκτέλεση δοκιμών σε JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Άγνωστο πλαίσιο δοκιμών " $1 ".',
@@ -3896,6 +3892,10 @@ $5
 'feedback-bugcheck' => 'Ωραία! Ελέγξτε μόνο ότι δεν είναι ήδη ένα από τα [ $1  γνωστά σφάλματα].',
 'feedback-bugnew' => 'Έλεγξα. Αναφέρετε ένα νέο σφάλμα',
 
+# Search suggestions
+'searchsuggest-search' => 'Αναζήτηση',
+'searchsuggest-containing' => 'περιέχει...',
+
 # API errors
 'api-error-badaccess-groups' => 'Δεν επιτρέπεται να ανεβάσετε αρχεία σε αυτό το wiki.',
 'api-error-badtoken' => 'Εσωτερικό σφάλμα: εσφαλμένο διακριτικό.',
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 097199b..dc5fb52 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' ),
@@ -784,7 +783,6 @@ XHTML id names.
 'qbbrowse'       => 'Browse',
 'qbedit'         => 'Edit',
 'qbpageoptions'  => 'This page',
-'qbpageinfo'     => 'Context',
 'qbmyoptions'    => 'My pages',
 'qbspecialpages' => 'Special pages',
 'faq'            => 'FAQ',
@@ -799,7 +797,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',
@@ -913,8 +911,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',
@@ -1066,7 +1064,7 @@ 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.
@@ -1485,6 +1483,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 +1759,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',
@@ -2206,16 +2211,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>.
@@ -2460,7 +2465,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',
@@ -2794,38 +2799,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 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.',
@@ -3068,8 +3073,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.",
@@ -3391,6 +3396,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 +3530,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".',
@@ -3737,6 +3742,7 @@ This is probably caused by a link to a blacklisted external site.',
 # Info page
 'pageinfo-header'              => '-', # do not translate or duplicate this message to other languages
 'pageinfo-title'               => 'Information for "$1"',
+'pageinfo-not-current'         => 'Information may only be displayed for the current revision.',
 'pageinfo-header-basic'        => 'Basic information',
 'pageinfo-header-edits'        => 'Edit history',
 'pageinfo-header-restrictions' => 'Page protection',
@@ -3751,7 +3757,7 @@ This is probably caused by a link to a blacklisted external site.',
 'pageinfo-views'               => 'Number of views',
 'pageinfo-watchers'            => 'Number of page watchers',
 'pageinfo-redirects-name'      => 'Redirects to this page',
-'pageinfo-redirects-value'     => '$1',
+'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',
@@ -3762,11 +3768,18 @@ This is probably caused by a link to a blacklisted external site.',
 '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-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
@@ -3812,29 +3825,29 @@ $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',
+'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,10 +3863,10 @@ 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}}',
@@ -4461,9 +4474,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!",
@@ -4876,7 +4890,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 +4904,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..ed973de 100644 (file)
@@ -456,7 +456,6 @@ $messages = array(
 'qbbrowse' => 'Foliumi',
 'qbedit' => 'Redakti',
 'qbpageoptions' => 'Paĝagado',
-'qbpageinfo' => 'Paĝinformoj',
 'qbmyoptions' => 'Personaĵoj',
 'qbspecialpages' => 'Specialaj paĝoj',
 'faq' => 'Oftaj demandoj',
@@ -722,7 +721,7 @@ 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.
@@ -1344,8 +1343,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',
@@ -2954,7 +2951,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".',
@@ -3951,6 +3947,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 829687c..13deced 100644 (file)
@@ -30,6 +30,7 @@
  * @author Clerc
  * @author Crazymadlover
  * @author Cvmontuy
+ * @author Dalton2
  * @author Danke7
  * @author David0811
  * @author Dferg
@@ -56,6 +57,7 @@
  * @author Locos epraix
  * @author Mahadeva
  * @author Manuelt15
+ * @author Maor X
  * @author McDutchie
  * @author Muro de Aguas
  * @author Omnipaedista
@@ -360,23 +362,23 @@ $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',
@@ -387,23 +389,23 @@ $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',
@@ -503,20 +505,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-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',
@@ -765,7 +766,7 @@ 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! ==
 
@@ -1135,6 +1136,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)
@@ -1189,7 +1199,7 @@ El motivo dado por $3 es ''$2''",
 Leyenda: (act) = diferencias con la versión actual,
 (prev) = diferencias con la versión previa, 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}})',
@@ -1297,12 +1307,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',
@@ -1392,8 +1402,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',
@@ -2047,7 +2055,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',
@@ -2238,7 +2246,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',
@@ -2584,8 +2592,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.",
@@ -2640,7 +2648,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
@@ -2885,6 +2893,7 @@ 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',
 'imagetypemismatch' => 'La nueva extensión de archivo no corresponde con su tipo',
@@ -3012,7 +3021,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".',
@@ -3154,6 +3162,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' => 'Únicamente se puede mostrar la información para la revisión actual.',
 'pageinfo-header-basic' => 'Información básica',
 'pageinfo-header-edits' => 'Historial de ediciones',
 'pageinfo-header-restrictions' => 'Protección de página',
@@ -3179,10 +3188,10 @@ 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-toolboxlink' => 'Información de la página',
 
 # Skin names
 'skinname-standard' => 'Estándar',
@@ -3762,6 +3771,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
@@ -3993,8 +4003,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',
@@ -4041,6 +4051,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.',
index f90569b..a73374c 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',
@@ -697,7 +696,7 @@ 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! ==
 
@@ -1300,8 +1299,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',
@@ -2914,7 +2911,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".',
@@ -3052,7 +3048,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)',
@@ -3418,8 +3413,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',
@@ -3440,16 +3435,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',
@@ -3874,6 +3869,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..83bc472 100644 (file)
@@ -269,7 +269,6 @@ $messages = array(
 'qbbrowse' => 'Arakatu',
 'qbedit' => 'Aldatu',
 'qbpageoptions' => 'Orrialde hau',
-'qbpageinfo' => 'Testuingurua',
 'qbmyoptions' => 'Nire orrialdeak',
 'qbspecialpages' => 'Aparteko orrialdeak',
 'faq' => 'Maiz egindako galderak',
@@ -514,7 +513,7 @@ 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! ==
 
@@ -1076,8 +1075,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',
@@ -3295,4 +3292,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..bbfb129 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,7 +376,7 @@ 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! ==
 
@@ -790,8 +789,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'''.",
index 10eaad8..6282d84 100644 (file)
@@ -576,7 +576,6 @@ $messages = array(
 'qbbrowse' => 'مرور',
 'qbedit' => 'ویرایش',
 'qbpageoptions' => 'این صفحه',
-'qbpageinfo' => 'محتوا',
 'qbmyoptions' => 'صفحه‌های من',
 'qbspecialpages' => 'صفحه‌های ویژه',
 'faq' => 'پرسش‌های متداول',
@@ -589,7 +588,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' => 'نمایش تاریخچه',
@@ -674,7 +673,7 @@ $1',
 'disclaimerpage' => 'Project:تکذیب‌نامهٔ عمومی',
 'edithelp' => 'راهنمای ویرایش‌کردن',
 'edithelppage' => 'Help:ویرایش',
-'helppage' => 'Help:محتویات',
+'helppage' => 'Help:محتوا',
 'mainpage' => 'صفحهٔ اصلی',
 'mainpage-description' => 'صفحهٔ اصلی',
 'policy-url' => 'Project:سیاست‌ها',
@@ -848,7 +847,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''هم‌اکنون از سامانه خارج شدید.'''
 
-شما می‌توانید به استفادهٔ گمنام از {{SITENAME}} ادامه دهید، یا با همین حساب کاربری یا حسابی دیگر [[Special:UserLogin|به سامانه وارد شوید]].
+شما می‌توانید به استفادهٔ گمنام از {{SITENAME}} ادامه دهید، یا با همین حساب کاربری یا حسابی دیگر <span class='plainlinks'>[$1 به سامانه وارد شوید]</span>.
 توجه کنید که تا زمانی که میانگیر مرورگرتان را پاک نکنید، بعضی صفحه‌ها ممکن است به گونه‌ای نمایش یابند که گویی هنوز از سامانه خارج نشده‌اید.",
 'welcomecreation' => '==$1، خوش آمدید!==
 حساب شما ایجاد شد.
@@ -1060,32 +1059,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|ترجیحات کاربر]] این کار را صورت دهید.',
@@ -1128,8 +1125,8 @@ $2
 *'''گوگل کروم:'''کلیدهای ''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' => "'''به یاد داشته باشید که شما فقط دارید جاوااسکریپت کاربری‌تان را امتحان می‌کنید/پیش‌نمایش آن را می‌بینید.'''
@@ -1155,7 +1152,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' => "'''بعضی قسمت‌های فرم ویرایش به سرور نرسیدند؛ اطمینان حاصل کنید که ویرایش‌های شما کامل است و دوباره تلاش کنید.'''",
@@ -1229,6 +1226,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' => "'''هشدار:''' این صفحه حاوی تعدادی زیادی فراخوانی دستورهای تجزیه‌گر است.
@@ -1414,8 +1420,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' => 'صفحهٔ مبدأ و مقصد نمی‌تواند یکی باشد',
@@ -1459,11 +1465,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' => 'صفحه‌های راهنما و پروژه',
@@ -1484,8 +1490,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' => 'جستجو در تمام فضاهای نام',
@@ -1500,7 +1504,7 @@ $1",
 'powersearch' => 'جستجوی پیشرفته',
 'powersearch-legend' => 'جستجوی پیشرفته',
 'powersearch-ns' => 'جستجو در فضاهای نام:',
-'powersearch-redir' => 'تغییرمسیرها فهرست شوند',
+'powersearch-redir' => 'فهرست‌کردن تغییرمسیرها',
 'powersearch-field' => 'جستجو برای',
 'powersearch-togglelabel' => 'بررسی:',
 'powersearch-toggleall' => 'همه',
@@ -1529,22 +1533,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' => 'ذخیره',
@@ -1559,7 +1563,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' => 'پرکردن این بخش با یک کلید رمز سبب ایجاد یک خوراک آراس‌اس برای فهرست پی‌گیری شما می‌شود.
@@ -1584,7 +1588,7 @@ $1",
 'timezoneregion-indian' => 'اقیانوس هند',
 'timezoneregion-pacific' => 'اقیانوس آرام',
 'allowemail' => 'امکان دریافت رایانامه از دیگر کاربران',
-'prefs-searchoptions' => 'گزینه‌های جستجو',
+'prefs-searchoptions' => 'جستجو',
 'prefs-namespaces' => 'فضاهای نام',
 'defaultns' => 'در غیر این صورت جستجو در این فضاهای نام:',
 'default' => 'پیش‌فرض',
@@ -1598,7 +1602,7 @@ $1",
 'prefs-textboxsize' => 'اندازهٔ جعبهٔ ویرایش',
 'youremail' => 'رایانامه:',
 'username' => 'نام کاربری:',
-'uid' => 'Ø´Ù\85ارÙ\87Ù\94 Ú©Ø§Ø±Ø¨Ø±Û\8c:',
+'uid' => 'Ø´Ù\86اسÙ\87Ù\94 Ú©Ø§Ø±Ø¨Ø±:',
 'prefs-memberingroups' => 'عضو این {{PLURAL:$1|گروه|گروه‌ها}}:',
 'prefs-registration' => 'زمان ثبت‌نام:',
 'yourrealname' => 'نام واقعی:',
@@ -1610,7 +1614,7 @@ $1",
 'badsig' => 'امضای خام غیرمجاز.
 لطفاً برچسب‌های اچ‌تی‌ام‌ال را بررسی کنید.',
 'badsiglength' => 'امضای شما بیش از اندازه طولانی است.
-امضا باید کمتر از $1 نویسه طول داشته باشد.',
+امضا باید کمتر از $1 {{PLURAL:$1|نویسه}} طول داشته باشد.',
 'yourgender' => 'جنسیت:',
 'gender-unknown' => 'مشخص‌نشده',
 'gender-male' => 'مرد',
@@ -1618,7 +1622,7 @@ $1",
 'prefs-help-gender' => 'اختیاری: برای خطاب‌شدن با جنسیت درست توسط نرم‌افزار به کار می‌رود.
 این اطلاعات عمومی خواهد بود.',
 'email' => 'رایانامه',
-'prefs-help-realname' => 'نام واقعی اختیاری است
+'prefs-help-realname' => 'نام واقعی اختیاری است.
 اگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آن‌ها به شما از نام واقعی‌تان استفاده خواهد شد.',
 'prefs-help-email' => 'نشانی رایانامه اختیاری‌است، اما فرستادن گذرواژه‌ای جدید را اگر گذرواژهٔ خود را فراموش کنید ممکن می‌کند.',
 'prefs-help-email-others' => 'شما همچنین می‌توانید انتخاب کنید که کاربران بتوانند از طریق پیوندی در صفحهٔ کاربری یا صفحهٔ بحث کاربری‌تان به شما رایانامه بفرستند.
@@ -1693,8 +1697,8 @@ $1",
 'right-read' => 'خواندن صفحه',
 'right-edit' => 'ویرایش صفحه',
 'right-createpage' => 'ایجاد صفحه (در مورد صفحه‌های غیر بحث)',
-'right-createtalk' => 'ایجاد صفحهٔ بحث',
-'right-createaccount' => 'ایجاد حساب کاربری',
+'right-createtalk' => 'ایجاد صفحه‌های بحث',
+'right-createaccount' => 'ایجاد حساب‌های کاربری',
 'right-minoredit' => 'علامت‌زدن ویرایش‌ها به عنوان جزئی',
 'right-move' => 'انتقال صفحه',
 'right-move-subpages' => 'انتقال صفحه‌ها به همراه زیر‌صفحه‌هایشان',
@@ -1719,7 +1723,7 @@ $1",
 'right-deletedhistory' => 'مشاهدهٔ موارد حذف‌شده از تاریخچه، بدون دیدن متن آن‌ها',
 'right-deletedtext' => 'مشاهدهٔ متن حذف‌شده و تغییرات بین نسخه‌های حذف‌شده',
 'right-browsearchive' => 'جستجوی صفحه‌های حذف‌شده',
-'right-undelete' => 'احیای صفحه‌ای حذف‌شده',
+'right-undelete' => 'احیای صفحه‌ها',
 'right-suppressrevision' => 'بازبینی و احیای ویرایش‌هایی که از مدیران پنهان شده‌اند',
 'right-suppressionlog' => 'مشاهدهٔ سیاهه‌های خصوصی',
 'right-block' => 'قطع دسترسی ویرایشی دیگر کاربران',
@@ -2146,7 +2150,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',
@@ -2696,7 +2700,7 @@ $NEWPAGE
 'undeletedrevisions-files' => '$1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.',
 'undeletedfiles' => '$1 پرونده احیا {{PLURAL:$1|شد|شدند}}.',
 'cannotundelete' => 'احیا ناموفق بود؛
-ممکن است کس دیگری پیشتر این صفحه را احیا کرده باشد.',
+$1',
 'undeletedpage' => "'''$1 احیا شد'''
 
 برای دیدن سیاههٔ حذف‌ها و احیاهای اخیر به  [[Special:Log/delete|سیاههٔ حذف]] رجوع کنید.",
@@ -3006,6 +3010,7 @@ $1',
 'immobile-target-namespace-iw' => 'پیوند میان‌ویکی هدفی مجاز برای انتقال صفحه نیست.',
 'immobile-source-page' => 'این صفحه قابل انتقال نیست.',
 'immobile-target-page' => 'امکان انتقال به این عنوان مقصد وجود ندارد.',
+'bad-target-model' => 'مقصد مورد نظر از مدل محتوایی متفاوتی استفاده می‌کند. تبدیل $1 به $2 ممکن نیست.',
 'imagenocrossnamespace' => 'امکان انتقال تصویر به فضای نام غیر پرونده وجود ندارد',
 'nonfile-cannot-move-to-file' => 'امکان انتقال محتوای غیر پرونده به فضای نام پرونده وجود ندارد',
 'imagetypemismatch' => 'پسوند پرونده جدید با نوع آن سازگار نیست',
@@ -3134,7 +3139,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'آزمایش جاوا اسکریپت',
-'javascripttest-disabled' => 'این عملکرد در این ویکی فعال نشده‌است.',
 'javascripttest-title' => 'در حال اجرای آزمایش‌های $1',
 'javascripttest-pagetext-noframework' => 'این صفحه برای اجرای آزمایش‌های جاوا اسکریپت کنار گذاشته شده‌است.',
 'javascripttest-pagetext-unknownframework' => 'چارچوب آزمایشی ناشناخته «$1».',
@@ -3244,6 +3248,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'اطلاعات در مورد «$1»',
+'pageinfo-not-current' => 'اطلاعات ممکن است تنها برای نسخهٔ فعلی نمایش داده شود.',
 'pageinfo-header-basic' => 'اطلاعات اولیه',
 'pageinfo-header-edits' => 'ویرایش تاریخچه',
 'pageinfo-header-restrictions' => 'حفاظت از صفحه',
@@ -3268,10 +3273,10 @@ $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' => 'اطلاعات صفحه',
 
 # Skin names
 'skinname-standard' => 'کلاسیک',
@@ -3851,6 +3856,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[تراگنجانش بین‌ویکیانه فعال نیست]',
 'scarytranscludefailed' => '[فراخوانی الگو برای $1 میسر نشد]',
+'scarytranscludefailed-httpstatus' => '[فراخوانی الگو برای $1 میسر نشد: خطای اچ‌تی‌تی‌پی $2]',
 'scarytranscludetoolong' => '[نشانی اینترنتی مورد نظر (URL) بیش از اندازه بلند بود]',
 
 # Delete conflict
@@ -4189,6 +4195,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 e5beddb..db0ff0c 100644 (file)
@@ -13,6 +13,7 @@
  * @author Crt
  * @author ElmA
  * @author Harriv
+ * @author Hyperborean
  * @author Jaakonam
  * @author Jack Phoenix
  * @author Jafeluv
@@ -457,7 +458,6 @@ $messages = array(
 'qbbrowse' => 'Selaa',
 'qbedit' => 'Muokkaa',
 'qbpageoptions' => 'Sivuasetukset',
-'qbpageinfo' => 'Sivun tiedot',
 'qbmyoptions' => 'Asetukset',
 'qbspecialpages' => 'Toimintosivut',
 'faq' => 'Usein kysytyt kysymykset',
@@ -470,7 +470,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',
@@ -673,8 +673,8 @@ Joku muu on saattanut poistaa sen.',
 'delete-hook-aborted' => 'Laajennuskoohdi esti muokkauksen antamatta syytä.',
 'badtitle' => 'Virheellinen otsikko',
 'badtitletext' => 'Pyytämäsi sivuotsikko oli virheellinen, tyhjä tai väärin linkitetty kieltenvälinen tai wikienvälinen linkki.',
-'perfcached' => 'Tiedot ovat välimuistista eivätkä välttämättä ole ajan tasalla. Välimuistissa on enintään {{PLURAL:$1|yksi tulos|$1 tulosta}}.',
-'perfcachedts' => 'Tiedot ovat välimuistista ja se päivitettiin viimeksi $1. Välimuistissa on enintään {{PLURAL:$4|yksi tulos|$4 tulosta}}.',
+'perfcached' => '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' => 'Tiedot ovat välimuistista ja se päivitettiin 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',
@@ -714,7 +714,7 @@ 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.
@@ -781,7 +781,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.',
@@ -994,7 +994,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',
@@ -1050,6 +1050,11 @@ Se on ilmeisesti poistettu.',
 'edit-already-exists' => 'Uuden sivun luominen ei onnistunut.
 Se on jo olemassa.',
 'defaultmessagetext' => 'Viestin oletusteksti',
+'content-not-allowed-here' => '$1 ei ole sallittua sisältöä sivulla [[$2]]',
+
+# Content models
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Tällä sivulla on liian monta hitaiden laajennusfunktioiden kutsua.
@@ -1301,8 +1306,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',
@@ -1939,6 +1942,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',
@@ -2467,7 +2471,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.",
@@ -2876,7 +2881,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.',
@@ -3015,20 +3019,32 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 # Info page
 'pageinfo-title' => 'Tietoja sivusta $1',
 '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' => 'Näytä otsikko',
 'pageinfo-default-sort' => 'Oletuslajitteluavain',
+'pageinfo-length' => 'Sivun pituus (tavuina)',
 'pageinfo-article-id' => 'Sivun tunniste',
+'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-firstuser' => 'Sivun luonut',
+'pageinfo-firsttime' => 'Sivun luontipäivämäärä',
 'pageinfo-lastuser' => 'Viimeisin muokkaaja',
+'pageinfo-lasttime' => 'Viimeisimmän muokkausksen päivämäärä',
 'pageinfo-edits' => 'Muokkausten kokonaismäärä',
 'pageinfo-authors' => 'Sivun eri muokkaajien kokonaismäärä',
-'pageinfo-restriction' => 'Sivun suojaus ({{lcfirst:$1}})',
+'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-info' => 'tiedot',
+'pageinfo-contentpage-yes' => 'Kyllä',
+'pageinfo-protect-cascading-yes' => 'Kyllä',
 
 # Skin names
 'skinname-standard' => 'Perus',
@@ -3091,6 +3107,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',
@@ -3595,6 +3613,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
@@ -3874,6 +3893,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.',
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..861873b 100644 (file)
@@ -256,7 +256,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 +493,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,7 +513,7 @@ 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! ==
 
@@ -1071,8 +1070,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',
@@ -2253,6 +2250,9 @@ Hendan váttanarkoda fer úr gildi tann $4.',
 '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.',
index 3a176a9..33a24d2 100644 (file)
@@ -517,7 +517,6 @@ $messages = array(
 'qbbrowse' => 'Parcourir',
 'qbedit' => 'Modifier',
 'qbpageoptions' => 'Cette page',
-'qbpageinfo' => 'Contexte',
 'qbmyoptions' => 'Mes pages',
 'qbspecialpages' => 'Pages spéciales',
 'faq' => 'FAQ',
@@ -530,10 +529,10 @@ $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',
@@ -780,13 +779,13 @@ 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.
+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.",
 '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;:',
+'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}})',
@@ -846,7 +845,7 @@ 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 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.',
@@ -976,7 +975,7 @@ Si vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publicati
 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.
@@ -1135,6 +1134,15 @@ Il semble qu’elle ait été supprimée.',
 'edit-already-exists' => 'La nouvelle page n’a pas pu être créée.
 Elle existe déjà.',
 'defaultmessagetext' => 'Message par défaut',
+'content-failed-to-parse' => "Échec de l'analyse du contenu de $2 pour le modèle $1: $3",
+'invalid-content-data' => 'Données du contenu non valides',
+'content-not-allowed-here' => 'Le contenu "$1" n\'est pas autorisé sur la page [[$2]]',
+
+# 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.
@@ -1184,7 +1192,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',
@@ -1385,8 +1393,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',
@@ -1544,7 +1550,7 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 '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',
+'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 :',
@@ -1649,7 +1655,7 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 # 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',
+'rightslogentry' => "a modifié les droits de l'utilisateur « $1 » de $2 à $3",
 'rightslogentry-autopromote' => 'a été automatiquement promu de $2 à $3',
 'rightsnone' => '(aucun)',
 
@@ -2043,7 +2049,7 @@ Vous voulez peut-être modifier la description sur sa [$2 page de description].'
 'shared-repo' => 'un dépôt partagé',
 'shared-repo-name-wikimediacommons' => 'Wikimédia Commons',
 'filepage.css' => '/* Les styles CSS placés ici sont inclus dans la page de description du fichier, également incluse sur les clients wikis étrangers */',
-'upload-disallowed-here' => 'Malheureusement, vous ne peut pas remplacer cette image.',
+'upload-disallowed-here' => 'Vous ne pouvez pas remplacer ce fichier.',
 
 # File reversion
 'filerevert' => 'Rétablir $1',
@@ -2251,7 +2257,7 @@ Vous pouvez personnaliser l’affichage en sélectionnant le type de journal, le
 '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-hide-redirects' => 'Masquer les redirections',
@@ -2329,12 +2335,12 @@ Des [[{{MediaWiki:Listgrouprights-helppage}}|informations additionnelles]] peuve
 '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',
+'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 »',
+'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',
@@ -2343,7 +2349,7 @@ L’adresse électronique que vous avez indiquée dans [[Special:Preferences|vos
 '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 :',
@@ -2355,7 +2361,7 @@ L’adresse électronique que vous avez indiquée dans [[Special:Preferences|vos
 '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.',
@@ -2591,8 +2597,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.",
@@ -2624,14 +2630,14 @@ $1',
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => 'Contributions de l’utilisateur',
+'contributions' => "Contributions de l'utilisateur",
 '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.',
 '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 +2653,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
@@ -2671,15 +2677,15 @@ 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',
-'blockip' => 'Bloquer l’utilisateur',
-'blockip-title' => 'Bloquer l’utilisateur',
-'blockip-legend' => 'Bloquer l’utilisateur',
+'block' => "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',
@@ -2746,7 +2752,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',
@@ -2891,6 +2897,7 @@ impossible de renommer une page sur elle-même.',
 '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.',
+'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.",
 'imagetypemismatch' => 'La nouvelle extension de ce fichier ne correspond pas à son type.',
@@ -3018,7 +3025,6 @@ Un dossier temporaire est manquant.",
 
 # 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.',
@@ -3139,8 +3145,8 @@ 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',
@@ -3160,6 +3166,7 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 
 # Info page
 'pageinfo-title' => 'Informations pour « $1 »',
+'pageinfo-not-current' => 'Les informations peuvent uniquement être affichées pour la révision en cours.',
 'pageinfo-header-basic' => 'Informations de base',
 'pageinfo-header-edits' => 'Historique des modifications',
 'pageinfo-header-restrictions' => 'Protection de la page',
@@ -3184,10 +3191,10 @@ 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',
 
 # Skin names
 'skinname-standard' => 'Standard',
@@ -3776,6 +3783,7 @@ $5',
 # 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
@@ -3992,7 +4000,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 +4087,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',
@@ -4115,6 +4123,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 ».',
@@ -4153,18 +4165,18 @@ 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}}',
 
 );
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..e29cee5 100644 (file)
@@ -454,7 +454,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 +466,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',
@@ -689,10 +688,11 @@ 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',
@@ -712,7 +712,7 @@ 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.
@@ -1345,8 +1345,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 +1443,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',
@@ -2985,7 +2983,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 +4060,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..7d8baf0 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,7 +421,7 @@ 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! ==
 
@@ -1026,8 +1025,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..5841167 100644 (file)
@@ -410,7 +410,7 @@ 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. 
@@ -692,8 +692,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',
@@ -1701,6 +1699,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..71b79b4 100644 (file)
@@ -504,7 +504,7 @@ 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.',
@@ -942,8 +942,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',
index 522a976..cee9a1e 100644 (file)
@@ -476,7 +476,7 @@ 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! ==
 
@@ -802,8 +802,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',
@@ -2234,4 +2232,7 @@ Rachaidh an cód deimhnithe seo as feidhm ag $4.',
 'feedback-message' => 'Teachtaireacht:',
 'feedback-cancel' => 'Cealaigh',
 
+# Search suggestions
+'searchsuggest-search' => 'Cuardaigh',
+
 );
index bb10a36..5502087 100644 (file)
@@ -375,8 +375,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.',
+'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.",
 'welcomecreation' => '== Hoş geldiniz $1! ==
 
 Esapınız açıldı. Unutmayın [[Special:Preferences|{{SITENAME}} preferences]] seçimnerin diiştirmää.',
@@ -588,8 +588,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 b8cc328..a373aeb 100644 (file)
@@ -176,7 +176,6 @@ $messages = array(
 'qbbrowse' => '查看',
 'qbedit' => '编写',
 'qbpageoptions' => '个页',
-'qbpageinfo' => '个页信息',
 'qbmyoptions' => '偶𠮶选项',
 'qbspecialpages' => '特殊页',
 'faq' => 'FAQ',
@@ -401,7 +400,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''汝退出正哩。'''
 
-接到汝得匿名使用{{SITENAME}},或[[Special:UserLogin|登入过]]。除非汝删吥浏览器缓存,只把子页面可能会接到话汝系登入状态。",
+接到汝得匿名使用{{SITENAME}},或<span class='plainlinks'>[$1 登入过]</span>。除非汝删吥浏览器缓存,只把子页面可能会接到话汝系登入状态。",
 'welcomecreation' => '== 欢迎, $1! ==
 
 建正哩汝𠮶帐户,莫𫍧记设置 [[Special:Preferences|{{SITENAME}}𠮶个人参数]]。',
@@ -767,8 +766,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>条结果:',
@@ -2271,4 +2268,7 @@ $3
 # Special:Tags
 'tag-filter' => '[[Special:Tags|标签]]过滤器:',
 
+# Search suggestions
+'searchsuggest-search' => '寻吖',
+
 );
index b07988d..060e337 100644 (file)
@@ -198,7 +198,6 @@ $messages = array(
 'qbbrowse' => '查看',
 'qbedit' => '編寫',
 'qbpageoptions' => '箇頁',
-'qbpageinfo' => '箇頁信息',
 'qbmyoptions' => '我嗰頁面',
 'qbspecialpages' => '特殊頁',
 'faq' => 'FAQ',
@@ -423,7 +422,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''汝退出正哩。'''
 
-接到汝得匿名使用{{SITENAME}},或[[Special:UserLogin|登入過]]。除非汝刪吥瀏覽器緩存,隻把子頁面可能會接到話汝係登入狀態。",
+接到汝得匿名使用{{SITENAME}},或<span class='plainlinks'>[$1 登入過]</span>。除非汝刪吥瀏覽器緩存,隻把子頁面可能會接到話汝係登入狀態。",
 'welcomecreation' => '== 歡迎, $1! ==
 
 建正哩汝嗰帳戶,莫誺記設置 [[Special:Preferences|{{SITENAME}}嗰個人參數]]。',
@@ -789,8 +788,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>條結果:',
@@ -2293,4 +2290,7 @@ $3
 # Special:Tags
 'tag-filter' => '[[Special:Tags|標籤]]過濾器:',
 
+# Search suggestions
+'searchsuggest-search' => '尋吖',
+
 );
index cf837a4..4be696f 100644 (file)
@@ -431,7 +431,7 @@ 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.
@@ -908,8 +908,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',
@@ -1534,4 +1532,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 1e47946..2009897 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 לערי ריינהארט
  */
@@ -367,20 +369,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',
@@ -488,7 +489,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',
@@ -586,8 +587,8 @@ 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á.',
@@ -632,7 +633,7 @@ 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.
@@ -873,7 +874,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.',
@@ -1012,6 +1013,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 +1278,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',
@@ -1386,7 +1394,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:',
@@ -1934,7 +1942,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 +2150,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',
 
@@ -2482,7 +2491,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.",
@@ -2647,7 +2657,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 +2795,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 +2921,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.',
@@ -3051,6 +3061,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' => 'Unicamente se pode mostrar a información sobre a revisión actual.',
 'pageinfo-header-basic' => 'Información básica',
 'pageinfo-header-edits' => 'Historial de edicións',
 'pageinfo-header-restrictions' => 'Protección da páxina',
@@ -3075,10 +3086,10 @@ 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',
 
 # Skin names
 'skinname-standard' => 'Clásica',
@@ -3664,6 +3675,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
@@ -3941,6 +3953,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.',
index 14353d3..511a535 100644 (file)
@@ -16,53 +16,53 @@ $fallback = 'fa';
 
 $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 +77,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..d287798 100644 (file)
@@ -180,7 +180,6 @@ $messages = array(
 'qbbrowse' => 'Ἀλάου',
 'qbedit' => 'Μεταγράφειν',
 'qbpageoptions' => 'Ἥδε ἡ δέλτος',
-'qbpageinfo' => 'Συγκείμενον',
 'qbmyoptions' => 'Οἱ δέλτοι μου',
 'qbspecialpages' => 'Εἰδικαὶ δέλτοι',
 'faq' => 'Τὰ πολλάκις αἰτηθέντα',
@@ -413,7 +412,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Νῦν γὰρ ἀποσυνδεδεμένος εἰ.'''
 
-Ἔξεστί σοι χρῆσθαι τῷ {{SITENAME}} ἀνωνύμως, ἢ ἔξεστί σοι [[Special:UserLogin|συνδεῖσθαι πάλιν]] ὡς ὁ αὐτὸς ἢ ὡς ἄλλος χρώμενος.
+Ἔξεστί σοι χρῆσθαι τῷ {{SITENAME}} ἀνωνύμως, ἢ ἔξεστί σοι <span class='plainlinks'>[$1 συνδεῖσθαι πάλιν]</span> ὡς ὁ αὐτὸς ἢ ὡς ἄλλος χρώμενος.
 Δέλτοι τινὲς δέ, ἐνδεχομένως, δειχθήσονται ὡς ἂν ἀκμὴν συνδεδεμένος ᾖς, μέχρι ὅτε καθαίρῃς τὴν λανθάνουσαν μνήμην τοῦ προγράμματος πλοηγήσεώς σου.",
 'welcomecreation' => '== Ὡς εὖ παρέστης, $1! ==
 
@@ -823,8 +822,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' => 'Ζήτησις ἐν πᾶσι τοῖς ὀνοματοχώροις',
@@ -2717,4 +2714,8 @@ $5
 # Feedback
 'feedback-cancel' => 'Ἀκυροῦν',
 
+# Search suggestions
+'searchsuggest-search' => 'Ζητεῖν',
+'searchsuggest-containing' => 'περιέχον...',
+
 );
index 88fff8f..7048d38 100644 (file)
@@ -278,7 +278,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 +290,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',
@@ -536,7 +535,7 @@ 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!==
@@ -719,7 +718,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',
@@ -896,6 +895,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.
@@ -1146,8 +1154,6 @@ Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 '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',
@@ -2316,7 +2322,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.",
@@ -2599,6 +2607,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',
@@ -2721,7 +2730,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“.',
@@ -2849,10 +2857,10 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 '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-restriction' => 'Syteschutz ({{lcfirst:$1}})',
 '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',
 
 # Patrolling
 'markaspatrolleddiff' => 'Als patrulyrt markyre',
@@ -3422,6 +3430,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
@@ -3689,6 +3698,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.',
index 67fd0e8..73f4bca 100644 (file)
@@ -229,7 +229,7 @@ $messages = array(
 'july' => 'જુલાઇ',
 'august' => 'ઓગસ્ટ',
 'september' => 'સપ્ટેમ્બર',
-'october' => 'ઓકટોબર',
+'october' => 'àª\93àª\95à«\8dàª\9fà«\8bબર',
 'november' => 'નવેમ્બર',
 'december' => 'ડિસેમ્બર',
 'january-gen' => 'જાન્યુઆરી',
@@ -241,7 +241,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 +294,6 @@ $messages = array(
 'qbbrowse' => 'બ્રાઉઝ',
 'qbedit' => 'ફેરફાર કરો',
 'qbpageoptions' => 'આ પાનું',
-'qbpageinfo' => 'સંદર્ભ',
 'qbmyoptions' => 'મારાં પાનાં',
 'qbspecialpages' => 'ખાસ પાનાં',
 'faq' => 'FAQ
@@ -557,7 +556,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''તમે (લોગ આઉટ કરીને) બહાર નિકળી ચુક્યા છો.'''
 
-તમે અનામી તરીકે {{SITENAME}} વાપરવાનું ચાલુ રાખી શકો છો, કે પછી તેના તે જ કે અલગ સભ્ય તરીકે [[Special:UserLogin|ફરી પ્રવેશ]] કરી શકો છો.
+તમે અનામી તરીકે {{SITENAME}} વાપરવાનું ચાલુ રાખી શકો છો, કે પછી તેના તે જ કે અલગ સભ્ય તરીકે <span class='plainlinks'>[$1 ફરી પ્રવેશ]</span> કરી શકો છો.
 ધ્યાન રાખો કે જ્યાં સુધી તમે તમારા બ્રાઉઝરનો  કૅશ સાફ નહીં કરો ત્યાં સુધી કેટલાક પાનાં તમે પ્રવેશી ચુક્યા છો તેમ બતાવશે.",
 'welcomecreation' => '== તમારૂં સ્વાગત છે $1! ==
 તમારૂં ખાતું બની ગયું છે.
@@ -820,8 +819,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 ની નોંધણી નથી થઈ',
@@ -1180,8 +1178,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' => 'નામસ્થળોમાં શોધો:',
@@ -1955,18 +1951,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 +2051,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" જેવા વાઈલ્ડાકાર્ડ અહીં વાપર્યા હોઈ શકે છે.
@@ -2813,7 +2810,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".',
@@ -3757,6 +3753,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..bbdab38 100644 (file)
@@ -586,8 +586,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',
@@ -1477,4 +1475,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..459e976 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',
@@ -624,8 +623,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í.',
index 45caf62..d086a2d 100644 (file)
@@ -473,8 +473,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',
index e83a84e..7fc84c8 100644 (file)
@@ -498,7 +498,6 @@ $messages = array(
 'qbbrowse' => 'דפדוף',
 'qbedit' => 'עריכה',
 'qbpageoptions' => 'אפשרויות דף',
-'qbpageinfo' => 'מידע על הדף',
 'qbmyoptions' => 'האפשרויות שלי',
 'qbspecialpages' => 'דפים מיוחדים',
 'faq' => 'שאלות ותשובות',
@@ -511,7 +510,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' => 'הצגת היסטוריה',
@@ -764,7 +763,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''יצאתם זה עתה מהחשבון.'''
 
-באפשרותכם להמשיך ולעשות שימוש ב{{grammar:תחילית|{{SITENAME}}}} באופן אנונימי, או [[Special:UserLogin|לשוב ולהיכנס לאתר]] עם שם משתמש זהה או אחר.
+באפשרותכם להמשיך ולעשות שימוש ב{{grammar:תחילית|{{SITENAME}}}} באופן אנונימי, או <span class='plainlinks'>[$1 לשוב ולהיכנס לאתר]</span> עם שם משתמש זהה או אחר.
 שימו לב כי ייתכן שדפים אחדים ימשיכו להיות מוצגים כאילו אתם עדיין מחוברים לחשבון עד שתנקו את המטמון של הדפדפן שלכם.",
 'welcomecreation' => '== ברוך בואך, $1! ==
 חשבונך נוצר.
@@ -845,7 +844,8 @@ $2',
 'acct_creation_throttle_hit' => 'מבקרים באתר זה דרך כתובת ה־IP שלכם כבר יצרו {{PLURAL:$1|חשבון אחד|$1 חשבונות}} ביום האחרון. זהו המקסימום המותר בתקופה זו.
 לפיכך, מבקרים דרך כתובת ה־IP הזו לא יכולים ליצור חשבונות נוספים ברגע זה.',
 'emailauthenticated' => 'כתובת הדוא"ל שלך אומתה ב־$3, $2.',
-'emailnotauthenticated' => 'כתובת הדוא"ל שלכם <strong>עדיין לא אושרה</strong> - שירותי הדוא"ל הבאים אינם פעילים.',
+'emailnotauthenticated' => 'כתובת הדוא"ל שלכם עדיין לא אושרה.
+לא יישלח אליכם דוא"ל עבור אף אחת מהאפשרויות הבאות.',
 'noemailprefs' => 'אנא ציינו כתובת דוא"ל בהעדפות שלכם כדי שתכונות אלה יעבדו.',
 'emailconfirmlink' => 'אישור כתובת הדוא"ל שלך',
 'invalidemailaddress' => 'כתובת הדוא"ל אינה מתקבלת כיוון שנראה שהיא בפורמט לא נכון.
@@ -1135,6 +1135,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' => "'''אזהרה:''' דף זה כולל יותר מדי קריאות לפונקציות מפענח שגוזלות משאבים.
@@ -1390,8 +1399,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' => 'חיפוש בכל מרחבי השם',
@@ -2054,7 +2061,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',
@@ -2343,7 +2350,7 @@ $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.',
\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' => 'שליחת דוא"ל למשתמשים מבוטלת',
@@ -2596,7 +2603,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|יומן המחיקות]] לרשימה של מחיקות ושחזורים אחרונים.",
@@ -2899,6 +2907,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' => 'סיומת הקובץ החדשה אינה מתאימה לסוג הקובץ',
@@ -3027,7 +3036,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'בדיקת JavaScript',
-'javascripttest-disabled' => 'תכונה זו לא הופעלה באתר הוויקי הזה.',
 'javascripttest-title' => 'הרצת בדיקות $1',
 'javascripttest-pagetext-noframework' => 'דף זה שמור להרצת בדיקות JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'סביבת הבדיקות "$1" אינה ידועה.',
@@ -3168,6 +3176,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'מידע על "$1"',
+'pageinfo-not-current' => 'המידע יכול להיות מוצג רק עבור הגרסה הנוכחית.',
 'pageinfo-header-basic' => 'מידע בסיסי',
 'pageinfo-header-edits' => 'היסטוריית עריכות',
 'pageinfo-header-restrictions' => 'הגנה על הדף',
@@ -3192,10 +3201,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' => 'קלאסי',
@@ -3771,7 +3787,8 @@ $5
 
 # Scary transclusion
 'scarytranscludedisabled' => '[הכללת דפים בין אתרים מבוטלת]',
-'scarytranscludefailed' => '[הכללת התבנית נכשלה בגלל $1]',
+'scarytranscludefailed' => '[אחזור התבנית נכשל עבור $1]',
+'scarytranscludefailed-httpstatus' => '[אחזור התבנית נכשל עבור $1&rlm;: HTTP $2]',
 'scarytranscludetoolong' => '[כתובת ה־URL ארוכה מדי]',
 
 # Delete conflict
@@ -4111,6 +4128,10 @@ $5
 'feedback-bugcheck' => 'מצוין! נא לבדוק שזה לא אחד מה[$1 באגים הידועים].',
 'feedback-bugnew' => 'בדקתי. נא לדווח כבאג חדש',
 
+# Search suggestions
+'searchsuggest-search' => 'חיפוש',
+'searchsuggest-containing' => 'כולל...',
+
 # API errors
 'api-error-badaccess-groups' => 'אינכם מורשים להעלות קבצים לאתר הוויקי הזה.',
 'api-error-badtoken' => 'שגיאה פנימית: אסימון רע.',
index f159368..e78fc8d 100644 (file)
@@ -322,7 +322,6 @@ $messages = array(
 'qbbrowse' => 'ब्राउज़',
 'qbedit' => 'बदलें',
 'qbpageoptions' => 'यह पृष्ठ',
-'qbpageinfo' => 'पृष्ठ जानकारी',
 'qbmyoptions' => 'मेरे पृष्ठ',
 'qbspecialpages' => 'विशेष पृष्ठ',
 'faq' => 'बहुधा पूछित प्रश्न',
@@ -581,7 +580,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''अब आपका सत्रांत हो चुका है।'''
 
-आप बेनामी हो के {{SITENAME}} का प्रयोग जारी रख सकते हैं, या उसी या किसी और सदस्य के तौर पर [[Special:UserLogin|फिर से सत्रारंभ]] कर सकते हैं।
+आप बेनामी हो के {{SITENAME}} का प्रयोग जारी रख सकते हैं, या उसी या किसी और सदस्य के तौर पर <span class='plainlinks'>[$1 फिर से सत्रारंभ]</span> कर सकते हैं।
 ध्यान दें कि जब तक आप अपनी ब्राउज़र कैशे खाली नहीं करते हैं, कुछ पृष्ठ अब भी ऐसे दिख सकते हैं जैसे कि आपका सत्र अभी भी चल रहा हो।",
 'welcomecreation' => '== आपका स्वागत है, $1 ! ==
 आपका खाता बनाया जा चुका है। अपनी [[Special:Preferences|{{SITENAME}} वरीयताएँ]] परिवर्तित करना न भूलिएगा।',
@@ -1197,8 +1196,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' => 'सभी नामस्थानों में खोजें',
@@ -3809,6 +3806,9 @@ $5
 'feedback-bugcheck' => 'शानदार! जांच ले कहीं ये [ $1 known bugs] पहले से ही न हो ।',
 'feedback-bugnew' => 'मैं जाँच कीया। एक नया बग रिपोर्ट करें',
 
+# Search suggestions
+'searchsuggest-search' => 'खोज',
+
 # API errors
 'api-error-badaccess-groups' => 'आपको इस विकि के लिए फ़ाइलें अपलोड करने की अनुमति नहीं है.',
 'api-error-badtoken' => 'आंतरिक त्रुटि: बुरी टोकन।',
index 261937c..e71cc73 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,7 +440,7 @@ 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.
@@ -447,6 +451,7 @@ Aapan [[Special:Preferences|{{SITENAME}} pasand]]  ke badle nai bhulna.',
 '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 +697,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 +811,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 +835,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 +969,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 +1067,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 +1165,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 +1291,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 +1580,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 +1776,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.
@@ -3027,4 +3037,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..983d30b 100644 (file)
@@ -427,7 +427,7 @@ 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.
@@ -1074,8 +1074,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..91fe9f8 100644 (file)
@@ -458,7 +458,6 @@ $messages = array(
 'qbbrowse' => 'Pregledaj',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Postavke stranice',
-'qbpageinfo' => 'O stranici',
 'qbmyoptions' => 'Moje stranice',
 'qbspecialpages' => 'Posebne stranice',
 'faq' => 'Najčešća pitanja',
@@ -711,7 +710,7 @@ $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.
@@ -1310,8 +1309,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',
@@ -2859,7 +2856,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',
@@ -3886,6 +3882,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.',
index a9c2d02..a4a648e 100644 (file)
@@ -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',
@@ -557,7 +556,7 @@ 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! ==
 
@@ -897,6 +896,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 +1156,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ć',
@@ -1799,7 +1805,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ć',
@@ -2329,7 +2335,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.",
@@ -2615,6 +2622,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 +2744,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 +2855,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' => 'Informacije hodźa so jenož za aktualnu wersiju zwobraznić.',
 'pageinfo-header-basic' => 'Zakładne informacije',
 'pageinfo-header-edits' => 'Stawizny wobdźěłać',
 'pageinfo-header-restrictions' => 'Škit strony',
@@ -2873,10 +2881,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',
@@ -3445,6 +3460,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
@@ -3721,6 +3737,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.',
index a2a5394..65845fe 100644 (file)
@@ -525,7 +525,7 @@ 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 ! ==
 
@@ -905,8 +905,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..f04aae4 100644 (file)
@@ -456,7 +456,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 +468,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',
@@ -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,7 +715,7 @@ 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.
@@ -1311,8 +1313,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',
@@ -1408,7 +1408,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 +1533,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 +1617,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 +1625,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 +1655,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:',
@@ -2057,6 +2058,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 +2087,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)',
@@ -2491,7 +2494,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.",
@@ -2874,6 +2877,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 +2910,8 @@ 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 log
 'importlogpage' => 'Importnapló',
@@ -2917,7 +2923,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 +3061,33 @@ 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-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)',
 
 # Skin names
 'skinname-standard' => 'Klasszikus',
@@ -3114,6 +3141,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 +3151,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',
@@ -3907,6 +3937,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..fdda6be 100644 (file)
@@ -416,7 +416,6 @@ $messages = array(
 'qbbrowse' => 'Թերթել',
 'qbedit' => 'Խմբագրել',
 'qbpageoptions' => 'Այս էջը',
-'qbpageinfo' => 'Հոդվածի մասին',
 'qbmyoptions' => 'Իմ էջերը',
 'qbspecialpages' => 'Սպասարկող էջեր',
 'faq' => 'ՀՏՀ',
@@ -662,7 +661,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Դուք դուրս եկաք համակարգից։'''
 
-Դուք կարող եք շարունակել օգտագործել {{SITENAME}} կայքը անանուն, կամ [[Special:UserLogin|կրկին մուտք գործել համակարգ]] նույն կամ մեկ այլ մասնակցի անվամբ։ Ի նկատի ունեցեք, որ որոշ էջեր կարող են ցուցադրվել այնպես՝ ինչպես եթե դեռ համակարգում լինեիք մինչև որ չջնջեք ձեր զննարկիչի հիշապահեստը։",
+Դուք կարող եք շարունակել օգտագործել {{SITENAME}} կայքը անանուն, կամ <span class='plainlinks'>[$1 կրկին մուտք գործել համակարգ]</span> նույն կամ մեկ այլ մասնակցի անվամբ։ Ի նկատի ունեցեք, որ որոշ էջեր կարող են ցուցադրվել այնպես՝ ինչպես եթե դեռ համակարգում լինեիք մինչև որ չջնջեք ձեր զննարկիչի հիշապահեստը։",
 'welcomecreation' => '== Բարի՛ գալուստ, $1 ==
 Ձեր հաշիվը ստեղծված է։
 Չմոռանաք անձնավորել ձեր [[Special:Preferences|նախընտրությունները]]։',
@@ -1099,8 +1098,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' => 'Որոնել բոլոր անվանատարածքներում',
@@ -2574,4 +2571,7 @@ $3
 'logentry-newusers-create' => '$1 մասնակիցը ստեղծեց նոր հաշիվ',
 'logentry-newusers-create2' => '$1 Ստեղծեց նոր հաշիվ $3',
 
+# Search suggestions
+'searchsuggest-search' => 'Որոնել',
+
 );
index 135e150..a66fd28 100644 (file)
@@ -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',
@@ -552,7 +551,7 @@ 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.
@@ -941,6 +940,7 @@ 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',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Attention: Iste pagina contine troppo de appellos costose al functiones del analysator syntactic.
@@ -1199,8 +1199,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',
@@ -2866,7 +2864,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.',
@@ -3023,7 +3020,6 @@ 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)',
@@ -3885,6 +3881,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..2766fda 100644 (file)
@@ -481,7 +481,6 @@ $messages = array(
 'qbbrowse' => 'Navigasi',
 'qbedit' => 'Sunting',
 'qbpageoptions' => 'Halaman ini',
-'qbpageinfo' => 'Konteks halaman',
 'qbmyoptions' => 'Halaman saya',
 'qbspecialpages' => 'Halaman istimewa',
 'faq' => 'FAQ',
@@ -735,7 +734,7 @@ 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! ==
 
@@ -1340,8 +1339,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',
@@ -2919,7 +2916,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',
@@ -3939,6 +3935,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.',
index ec2cba0..91bc84a 100644 (file)
@@ -422,7 +422,7 @@ 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. 
index fcc45d6..b1a8e09 100644 (file)
@@ -439,7 +439,7 @@ 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.
@@ -732,8 +732,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',
@@ -1684,4 +1682,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 f924290..6f31430 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}})',
@@ -152,7 +152,7 @@ $messages = array(
 'category-empty' => "''Daytoy a kategoria ket agdama a saan nga aglaon kadagiti panid wenno midia.''",
 'hidden-categories' => '{{PLURAL:$1|Nailemmeng a kategoria|Nailemmeng a katkategoria}}',
 'hidden-category-category' => 'Nailemmeng a katkategoria',
-'category-subcat-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad nga apo ti kategoria.|Daytoy a kategoria ket adda kadagiti sumaganad nga {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}, manipud ti dagup nga $2.}}',
+'category-subcat-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad nga apo ti kategoria.|Daytoy a kategoria ket adda kadagiti sumaganad  {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}, manipud ti dagup nga $2.}}',
 'category-subcat-count-limited' => 'Daytoy a kategoria ket adda ti sumaganad  {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}.',
 'category-article-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a panid.|Ti sumaganad  {{PLURAL:$1|a panid|$1 a pampanid}} ket adda iti daytoy a kategoria, manipud ti dagup nga $2.}}',
 'category-article-count-limited' => 'Ti sumaganad {{PLURAL:$1|a panid |$1 a pampanid}} ket adda iti agdama a kategoria.',
@@ -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',
@@ -366,7 +365,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',
@@ -446,7 +445,7 @@ 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.
@@ -746,7 +745,7 @@ 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.'''
@@ -783,11 +782,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!'''",
@@ -1058,7 +1057,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 +1093,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',
@@ -1197,7 +1194,7 @@ 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',
@@ -1456,7 +1453,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 +1519,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]]',
@@ -1689,9 +1686,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,7 +1747,7 @@ 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',
@@ -1764,7 +1761,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,7 +1779,7 @@ 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',
 
@@ -1824,14 +1821,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 +1933,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:',
@@ -2195,7 +2192,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]]',
@@ -2433,7 +2430,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 +2587,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 +2605,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.',
@@ -2628,7 +2625,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 +2634,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 +2657,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 +2679,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 +2705,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 +2721,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 +2743,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".',
@@ -2812,9 +2808,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',
@@ -2876,10 +2872,10 @@ 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',
 
 # Patrolling
 'markaspatrolleddiff' => 'Markaan a kas napatruliaan',
@@ -3415,11 +3411,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
 
@@ -3721,6 +3717,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.',
index f48debb..395b33c 100644 (file)
@@ -541,8 +541,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..ca0f058 100644 (file)
@@ -409,7 +409,7 @@ 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.
@@ -672,8 +672,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'''.",
@@ -1556,4 +1554,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 d8ceb6f..4ba8dc3 100644 (file)
@@ -377,7 +377,6 @@ $messages = array(
 'qbbrowse' => 'Flakka',
 'qbedit' => 'Breyta',
 'qbpageoptions' => 'Þessi síða',
-'qbpageinfo' => 'Samhengi',
 'qbmyoptions' => 'Mínar síður',
 'qbspecialpages' => 'Kerfissíður',
 'faq' => 'Algengar spurningar',
@@ -637,7 +636,7 @@ 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.
@@ -1209,8 +1208,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',
@@ -2116,7 +2113,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',
@@ -2190,7 +2187,7 @@ Frekari breytingar á henni eða spallsíðu hennar munu verða sýndar þar, og
   $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}} síðunni $PAGETITLE.
@@ -2717,7 +2714,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 +2792,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
@@ -3671,6 +3667,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..5eaedf2 100644 (file)
@@ -412,7 +412,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 +424,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',
@@ -674,7 +673,7 @@ 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! ==
 
@@ -1021,6 +1020,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.
@@ -1269,8 +1277,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',
@@ -1910,7 +1916,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',
@@ -2444,7 +2450,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.",
@@ -2732,6 +2739,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 +2864,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 +3002,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 
 # Info page
 'pageinfo-title' => 'Informazioni per "$1"',
+'pageinfo-not-current' => 'Le informazioni possono essere visualizzate solo per la versione corrente.',
 'pageinfo-header-basic' => 'Informazioni di base',
 'pageinfo-header-edits' => 'Cronologia delle modifiche',
 'pageinfo-header-restrictions' => 'Protezione della pagina',
@@ -3019,10 +3027,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',
@@ -3601,6 +3616,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
@@ -3880,6 +3896,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.',
index d7a2e66..b716275 100644 (file)
@@ -370,7 +370,7 @@ $messages = array(
 'tog-hidepatrolled' => '最近の更新に巡回済みの編集を表示しない',
 'tog-newpageshidepatrolled' => '新しいページの一覧に巡回済みのページを表示しない',
 'tog-extendwatchlist' => 'ウォッチリストを拡張し、最新のものだけではなくすべての変更を表示',
-'tog-usenewrc' => '最近の更新とウォッチリストで複数の変更をページごとにまとめる(JavaScriptが必要)',
+'tog-usenewrc' => '最近の更新とウォッチリストで複数の変更をページごとにまとめる (JavaScript が必要)',
 'tog-numberheadings' => '見出しに番号を自動的に振る',
 'tog-showtoolbar' => '編集用のツールバーを表示(JavaScriptが必要)',
 'tog-editondblclick' => 'ダブルクリックで編集(JavaScriptが必要)',
@@ -494,7 +494,7 @@ $messages = array(
 
 'about' => '解説',
 'article' => '本文',
-'newwindow' => '(新しいウィンドウが開きます)',
+'newwindow' => '(新しいウィンドウで開きます)',
 'cancel' => '中止',
 'moredotdotdot' => '続き...',
 'mypage' => '自分のページ',
@@ -508,7 +508,6 @@ $messages = array(
 'qbbrowse' => '閲覧',
 'qbedit' => '編集',
 'qbpageoptions' => 'このページについて',
-'qbpageinfo' => '関連情報',
 'qbmyoptions' => '自分のページ',
 'qbspecialpages' => '特別ページ',
 'faq' => 'よくある質問と回答',
@@ -521,7 +520,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' => '履歴表示',
@@ -532,7 +531,7 @@ $messages = array(
 'variants' => '変種',
 
 'errorpagetitle' => 'エラー',
-'returnto' => '$1に戻る。',
+'returnto' => '$1 に戻る。',
 'tagline' => '提供:{{SITENAME}}',
 'help' => 'ヘルプ',
 'search' => '検索',
@@ -541,7 +540,7 @@ $messages = array(
 'searcharticle' => '表示',
 'history' => 'ページの履歴',
 'history_short' => '履歴',
-'updatedmarker' => '最後の訪問以降に更新されました',
+'updatedmarker' => '最終閲覧以降に変更されました',
 'printableversion' => '印刷用バージョン',
 'permalink' => 'この版への固定リンク',
 'print' => '印刷',
@@ -749,7 +748,7 @@ URL を間違って入力したか、正しくないリンクをたどった可
 '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 クエリ非表示)',
@@ -777,7 +776,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ログアウトしました。'''
 
-このまま匿名で{{SITENAME}}の使用を続行できます。同じまたは別の利用者として[[Special:UserLogin|もう一度ログイン]]することもできます。
+このまま匿名で{{SITENAME}}の使用を続行できます。同じまたは別の利用者として<span class='plainlinks'>[$1 もう一度ログイン]</span>することもできます。
 なお、ページによっては、ブラウザーのキャッシュをクリアするまで、ログインしているかのように表示され続ける場合があるためご注意ください。",
 'welcomecreation' => '== ようこそ、$1 さん! ==
 アカウントが作成されました。
@@ -1037,24 +1036,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 の版は存在しません。
 
 通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。 
@@ -1117,10 +1116,10 @@ IP アドレスは複数の利用者で共有されている場合がありま
 'editingold' => "'''警告:このページの古い版を編集しています。'''
 保存すると、この版以降に追加されていた変更がすべて失われます。",
 'yourdiff' => '差分',
-'copyrightwarning' => "{{SITENAME}}への投稿は、すべて$2(詳細は$1を参照)のもとで公開したと見なされることにご注意ください。
+'copyrightwarning' => "{{SITENAME}}への投稿は、すべて$2 (詳細は$1を参照) のもとで公開したと見なされることにご注意ください。
 あなたが投稿したものを、他人がよって遠慮なく編集し、それを自由に配布するのを望まない場合は、ここには投稿しないでください。<br />
 また、投稿するのは、あなたが書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください。
-'''著作権保護されている作品を、許諾なしに投稿しないでください'''",
+'''著作権保護されている作品を、許諾なしに投稿しないでください!'''",
 'copyrightwarning2' => "{{SITENAME}}へのすべての投稿は、他の利用者が編集、変更、除去する可能性があります。
 あなたの投稿を、他人が遠慮なく編集するのを望まない場合は、ここには投稿しないでください。<br />
 また、投稿するのは、あなたが書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は$1を参照)。
@@ -1170,6 +1169,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' => "'''警告:'''このページでの高負荷なパーサー関数の呼び出し回数が多過ぎます。
@@ -1296,7 +1304,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' => '他の利用者と同様に管理者からもデータを隠す',
@@ -1427,9 +1435,7 @@ $1",
 'search-suggest' => 'もしかして:$1',
 'search-interwiki-caption' => '姉妹プロジェクト',
 'search-interwiki-default' => '$1の結果:',
-'search-interwiki-more' => '(続き)',
-'search-mwsuggest-enabled' => '検索候補を表示',
-'search-mwsuggest-disabled' => '検索候補を表示しない',
+'search-interwiki-more' => '(続き)',
 'search-relatedarticle' => '関連',
 'mwsuggest-disable' => 'Ajaxによる検索候補の提示を無効にする',
 'searcheverything-enable' => 'すべての名前空間を検索',
@@ -1486,7 +1492,7 @@ $1",
 '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' => 'メールの設定',
@@ -1650,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' => '確認なしでサイトのキャッシュを破棄',
@@ -1674,7 +1680,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-hideuser' => '利用者名をブロックして公開記録から隠す',
 'right-ipblock-exempt' => 'IPブロック、自動ブロック、広域ブロックを回避',
 'right-proxyunbannable' => 'プロキシの自動ブロックを回避',
-'right-unblockself' => '自分自身に対するブロックを解除',
+'right-unblockself' => '自身に対するブロックを解除',
 'right-protect' => '保護レベルを変更し、保護されたページを編集',
 'right-editprotected' => '保護ページ(カスケード保護を除く)を編集',
 'right-editinterface' => 'ユーザーインターフェイスを編集',
@@ -1687,7 +1693,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-import' => '他のウィキからページを取り込み',
 'right-importupload' => 'ファイルアップロードでページを取り込み',
 'right-patrol' => '他人の編集を巡回済みにする',
-'right-autopatrol' => '自分の編集を自動的に巡回済みにする',
+'right-autopatrol' => '自身の編集を自動で巡回済みにする',
 'right-patrolmarks' => '最近の更新で巡回済み印を閲覧',
 'right-unwatchedpages' => 'ウォッチされていないページ一覧を閲覧',
 'right-mergehistory' => 'ページの履歴を統合',
@@ -1798,7 +1804,7 @@ $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' => "'''警告:その名前のファイルは、以前に削除または移動されています。'''
@@ -2110,7 +2116,7 @@ $1での[$2 ファイル解説ページ]にある説明を編集したほうが
 'shared-repo' => '共有リポジトリ',
 'shared-repo-name-wikimediacommons' => 'ウィキメディア・コモンズ',
 'filepage.css' => '/* ここに記述したCSSはファイル解説ページにて読み込まれます。また外部のクライアントウィキにも影響します */',
-'upload-disallowed-here' => '残念ながらこの画像には上書きできません。',
+'upload-disallowed-here' => 'このファイルには上書きできません。',
 
 # File reversion
 'filerevert' => '$1を差し戻す',
@@ -2259,7 +2265,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 'deadendpagestext' => '以下のページは、{{SITENAME}}の他のページにリンクしていません。',
 'protectedpages' => '保護されているページ',
 'protectedpages-indef' => '無期限保護のみ',
-'protectedpages-cascade' => '連続保護のみ',
+'protectedpages-cascade' => 'カスケード保護のみ',
 'protectedpagestext' => '以下のページは移動や編集が禁止されています',
 'protectedpagesempty' => '指定した条件で保護中のページは現在ありません。',
 'protectedtitles' => '作成保護されているページ名',
@@ -2293,7 +2299,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 'booksources-isbn' => 'ISBN:',
 'booksources-go' => '検索',
 'booksources-text' => 'お探しの書籍の新品/中古品を販売している外部サイトへのリンクを以下に列挙します。この書籍についてさらに詳しい情報があるかもしれません:',
-'booksources-invalid-isbn' => '指定したISBN番号は有効ではないようです。情報源から写し間違えていないか確認してください。',
+'booksources-invalid-isbn' => '指定した ISBN は有効ではないようです。情報源から写し間違えていないか確認してください。',
 
 # Special:Log
 'specialloguserlabel' => '実行者:',
@@ -2523,7 +2529,7 @@ $UNWATCHURL
 'actioncomplete' => '操作を完了しました',
 'actionfailed' => '操作に失敗しました',
 'deletedtext' => '「$1」は削除されました。
-最近の削除に関しては、$2を参照してください。',
+最近の削除については、$2を参照してください。',
 'dellogpage' => '削除記録',
 'dellogpagetext' => '以下は最近の削除と復元の一覧です。',
 'deletionlog' => '削除記録',
@@ -2599,7 +2605,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' => '無期限',
@@ -2621,7 +2627,7 @@ $2による直前の版へ変更されました。',
 'restriction-level' => '制限レベル:',
 'minimum-size' => '最小サイズ',
 'maximum-size' => '最大サイズ:',
-'pagesize' => '(バイト)',
+'pagesize' => '(バイト)',
 
 # Restrictions (nouns)
 'restriction-edit' => '編集',
@@ -2661,12 +2667,12 @@ $2による直前の版へ変更されました。',
 'undeleteviewlink' => '閲覧',
 'undeletereset' => 'リセット',
 'undeleteinvert' => '選択を反転',
-'undeletecomment' => '理由',
+'undeletecomment' => '理由:',
 'undeletedrevisions' => '{{PLURAL:$1|$1版}}を復元しました',
 'undeletedrevisions-files' => '{{PLURAL:$1|$1版}}と{{PLURAL:$2|$2ファイル}}を復元しました',
 'undeletedfiles' => '{{PLURAL:$1|$1ファイル}}を復元しました',
-'cannotundelete' => '復元に失敗しました
-他の誰かがこのページを既に復元した可能性があります。',
+'cannotundelete' => '復元に失敗しました:
+$1',
 'undeletedpage' => "'''$1を復元しました。'''
 
 最近の削除と復元の記録については[[Special:Log/delete|削除記録]]を参照してください。",
@@ -2692,9 +2698,9 @@ $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
@@ -2766,18 +2772,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アドレス',
@@ -2792,7 +2798,7 @@ $1',
 'ipb-blocklist' => '現在有効なブロックを表示',
 'ipb-blocklist-contribs' => '$1の投稿の一覧',
 'unblockip' => 'ブロックを解除',
-'unblockiptext' => '以ä¸\8bã\81®ã\83\95ã\82©ã\83¼ã\83 ã\82\92使ç\94¨ã\81\97ã\81¦ã\80\81以å\89\8dã\83\96ã\83­ã\83\83ã\82¯ã\81\97ã\81\9fIPã\82¢ã\83\89ã\83¬ã\82¹ã\81¾ã\81\9fã\81¯å\88©ç\94¨è\80\85ã\81\8bã\82\89ã\81®æ\9b¸ã\81\8dè¾¼ã\81¿ã\82¢ã\82¯ã\82»ã\82¹ã\82\92ã\83\96ã\83­ã\83\83ã\82¯解除できます。',
+'unblockiptext' => '以ä¸\8bã\81®ã\83\95ã\82©ã\83¼ã\83 ã\81§å\88©ç\94¨è\80\85ã\81¾ã\81\9fã\81¯IPã\82¢ã\83\89ã\83¬ã\82¹ã\81®ã\83\96ã\83­ã\83\83ã\82¯ã\82\92解除できます。',
 'ipusubmit' => 'このブロックを解除',
 'unblocked' => '[[User:$1|$1]]のブロックを解除しました',
 'unblocked-range' => '$1のブロックは解除されています',
@@ -2817,8 +2823,8 @@ $1',
 'expiringblock' => '$1$2に解除',
 'anononlyblock' => '匿名利用者のみ',
 'noautoblockblock' => '自動ブロック無効',
-'createaccountblock' => 'アカウント作成のブロック',
-'emailblock' => 'メール送信のブロック',
+'createaccountblock' => 'アカウント作成の禁止',
+'emailblock' => 'メール送信の禁止',
 'blocklist-nousertalk' => '自分のトークページの編集禁止',
 'ipblocklist-empty' => 'ブロック一覧は空です。',
 'ipblocklist-no-results' => '指定されたIPアドレスまたは利用者名はブロックされていません。',
@@ -2827,8 +2833,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' => 'この利用者は以前にブロックされたことがあります。
 参考のため、ブロックの記録を以下に示します:',
@@ -2975,6 +2981,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' => '新しいファイルの拡張子がファイルのタイプと一致していません',
@@ -3105,7 +3112,6 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript をテスト中',
-'javascripttest-disabled' => 'この機能はこのウィキでは有効にされていません。',
 'javascripttest-title' => '$1 のテストの実行',
 'javascripttest-pagetext-noframework' => 'このページは JavaScript のテストを実行するために予約されています。',
 'javascripttest-pagetext-unknownframework' => '未知のテストフレームワーク「$1」。',
@@ -3246,6 +3252,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 
 # Info page
 'pageinfo-title' => '「$1」の情報',
+'pageinfo-not-current' => '現在のバージョンの情報のみが表示される可能性があります。',
 'pageinfo-header-basic' => '基本情報',
 'pageinfo-header-edits' => '編集履歴',
 'pageinfo-header-restrictions' => 'ページの保護',
@@ -3271,10 +3278,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-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' => 'クラシック',
@@ -3357,6 +3371,9 @@ $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1、 $2 × $3',
+'seconds-abbrev' => '$1 s',
+'hours-abbrev' => '$1 h',
+'days-abbrev' => '$1 d',
 'seconds' => '{{PLURAL:$1|$1 秒}}',
 'minutes' => '{{PLURAL:$1|$1 分}}',
 'hours' => '{{PLURAL:$1|$1 時間}}',
@@ -3701,7 +3718,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' => 'インチ',
@@ -3920,6 +3937,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[ウィキ間の参照読み込みは無効になっています]',
 'scarytranscludefailed' => '[$1に対してテンプレートの取得に失敗しました]',
+'scarytranscludefailed-httpstatus' => '[$1に対してテンプレートの取得に失敗しました: HTTP $2]',
 'scarytranscludetoolong' => '[URLが長すぎます]',
 
 # Delete conflict
@@ -4003,11 +4021,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}}」をクリックしてください。
@@ -4021,7 +4039,7 @@ $5
 # 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' => 'ファルヴァルディーン',
@@ -4256,8 +4274,8 @@ MediaWikiは、有用であることを期待して配布されていますが
 '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' => 'キャンセル',
@@ -4271,6 +4289,10 @@ MediaWikiは、有用であることを期待して配布されていますが
 'feedback-bugcheck' => 'Great! [$1 既出のバグ]に既に含まれていないかご確認ください。',
 'feedback-bugnew' => 'チェックしました。バグを報告します。',
 
+# Search suggestions
+'searchsuggest-search' => '検索',
+'searchsuggest-containing' => 'この語句を全文検索',
+
 # API errors
 'api-error-badaccess-groups' => 'このウィキへのファイルのアップロードが許可されていません。',
 'api-error-badtoken' => '内部エラー:トークンが正しくありません。',
index 00c4950..5494817 100644 (file)
@@ -403,7 +403,7 @@ 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.
@@ -723,8 +723,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 245e315..cfc77ad 100644 (file)
@@ -195,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é)',
@@ -448,7 +447,7 @@ 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! ==
@@ -1023,8 +1022,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',
@@ -2592,7 +2589,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".',
@@ -3496,6 +3492,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 51a8bee..12356df 100644 (file)
@@ -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' => 'ისტორია',
@@ -584,7 +583,7 @@ $2',
 'logouttext' => "'''თქვენ ამჟამად სისტემიდან გასული ხართ.'''
 
 შეგიძლიათ გამოიყენოთ {{SITENAME}} ანონიმურად, ან შეგიძლიათ
-[[Special:UserLogin|შეხვიდეთ ისევ]] როგორც იგივე ან სხვა მომხმარებელი.
+<span class='plainlinks'>[$1 შეხვიდეთ ისევ]</span> როგორც იგივე ან სხვა მომხმარებელი.
 შენიშნეთ, რომ ზოგიერთ გვერდზე შესაძლოა ისევ უჩვენებდეს რომ შესული ხართ სანამ თქვენი ბრაუზერის მეხსიერებას არ გაწმენდთ.",
 'welcomecreation' => '== მოგესალმებით, $1! ==
 თქვენი ანგარიში შექმნილია.
@@ -956,6 +955,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' => 'ყურადღება. მოცემული გვერდი შეიცავს ძალიან ბევრ მძიმე ფუნქციას.
@@ -1207,8 +1215,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' => 'ძიება სახელთა ყველა სივრცეებში',
@@ -1855,7 +1861,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',
@@ -2404,7 +2410,8 @@ $UNWATCHURL
 'undeletedrevisions' => '$1 ვერსია აღდგენილია',
 'undeletedrevisions-files' => '$1 ვერსია და $2 ფაილი აღდგენილია',
 'undeletedfiles' => '$1 ფაილი აღდგენილია',
-'cannotundelete' => 'წაშლის გაუქმება ვერ განხორციელდა; შესაძლოა თქვენამდე სხვამ უკვე გააუქმა წაშლა.',
+'cannotundelete' => 'წაშლის გაუქმება ვერ განხორციელდა: 
+$1',
 'undeletedpage' => "'''$1 აღდგენილია'''
 
 უკანასკნელი წაშლილთა და აღდგენის სია შეგიძლიათ ნახოთ [[Special:Log/delete|წაშლილთა სიაში]].",
@@ -2698,6 +2705,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 +2830,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript-ის ტესტირება',
-'javascripttest-disabled' => 'ეს ფუნქცია ამ ვიკიში არ ჩართულა.',
 'javascripttest-title' => 'მიმდინარეობს $1-ის ტესტირება',
 'javascripttest-pagetext-noframework' => 'ეს გვერდი დარეგისტრირებულია JavaScript-ის ტესტების გასაშვებად.',
 'javascripttest-pagetext-unknownframework' => '„$1-ის“ ტესტირების უცნობი გარემო.',
@@ -2946,6 +2953,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'ინფორმაცია „$1“-თვის',
+'pageinfo-not-current' => 'მონაცემები წარმოდგენილია მხოლოდ მიმდინარე რედაქტირებისათვის.',
 'pageinfo-header-basic' => 'საბაზისო ინფორმაცია',
 'pageinfo-header-edits' => 'რედაქტირების ისტორია',
 'pageinfo-header-restrictions' => 'გვერდის დაცვა',
@@ -2971,10 +2979,10 @@ $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' => 'გვერდის ინფორმაცია',
 
 # Skin names
 'skinname-standard' => 'კლასიკური',
@@ -3601,6 +3609,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[«Interwiki transcluding» გათიშულია]',
 'scarytranscludefailed' => '[$1-თან დაკავშირების შეცდომა]',
+'scarytranscludefailed-httpstatus' => '[ვერ მოხერხდა თარგის ჩატვირთვა $1-თვის: HTTP $2]',
 'scarytranscludetoolong' => '[URL ძალიან გრძელია]',
 
 # Delete conflict
@@ -3908,6 +3917,10 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'feedback-bugcheck' => 'კარგია! გთხოვთ, კიდევ ერთხელ შეამოწმეთ, ხომ არ არის აქ რომელიმე უკვე [$1 ნაცნობი შეცდომა].',
 'feedback-bugnew' => 'მე შევამოწმე. ახალი შეცდომის შეტყობინება',
 
+# Search suggestions
+'searchsuggest-search' => 'ძიება',
+'searchsuggest-containing' => 'შეიცავს...',
+
 # API errors
 'api-error-badaccess-groups' => 'თქვენ არ გაქვთ ამ ვიკიში ფაილების ატვირთვის უფლება.',
 'api-error-badtoken' => 'შიდა შეცდომა: ცუდი ტოკენი.',
index 1425327..6e8a6d4 100644 (file)
@@ -511,7 +511,7 @@ 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! ==
 
@@ -853,8 +853,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ı',
index cd571f6..1c2ed16 100644 (file)
@@ -9,9 +9,11 @@
  *
  * @author Agurzil
  * @author Agzennay
+ * @author Amazigh84
  * @author Azwaw
  * @author Mmistmurt
  * @author MoubarikBelkasim
+ * @author Salem333
  * @author Teak
  * @author Urhixidur
  */
@@ -185,7 +187,6 @@ $messages = array(
 'qbbrowse' => 'Ẓer isebtar',
 'qbedit' => 'Beddel',
 'qbpageoptions' => 'Asebter-agi',
-'qbpageinfo' => 'Asatal',
 'qbmyoptions' => 'isebtar inu',
 'qbspecialpages' => 'isebtar usligen',
 'faq' => 'Isteqsiyen',
@@ -198,7 +199,7 @@ $messages = array(
 'vector-action-protect' => 'Mmesten',
 'vector-action-undelete' => 'Uɣaled',
 'vector-action-unprotect' => 'Beddel amesten',
-'vector-simplesearch-preference' => 'Sermed isumar n unadi i silɣen (i "Vector" kan)',
+'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',
@@ -221,7 +222,7 @@ $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',
@@ -270,6 +271,7 @@ 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}}',
@@ -303,6 +305,10 @@ $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',
@@ -382,7 +388,7 @@ Ilaq ad εeggenem yiwen [[Special:ListUsers/sysop|anedbal]] war ad ttum asefkem
 '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.',
@@ -392,6 +398,8 @@ Ilaq ad εeggenem yiwen [[Special:ListUsers/sysop|anedbal]] war ad ttum asefkem
 '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.',
@@ -414,11 +422,28 @@ Query: $2',
 '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 tesensereḍ.'''
 
-Tzemreḍ ad tesseqdceḍ {{SITENAME}} d udrig, [[Special:UserLogin|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 yisek (yisem), $1 ! ==
 
@@ -430,6 +455,7 @@ Ur tettuḍ ara ad tbeddleḍ [[Special:Preferences|isemyifiyen inek (inem) ɣef
 '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',
@@ -453,6 +479,8 @@ Ur tettuḍ ara ad tbeddleḍ [[Special:Preferences|isemyifiyen inek (inem) ɣef
 '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\".'''",
@@ -460,9 +488,12 @@ Ur tettuḍ ara ad tbeddleḍ [[Special:Preferences|isemyifiyen inek (inem) ɣef
 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-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čč/kem, seg tansa IP $1) yesteqsa iwakken a nazen
@@ -472,6 +503,7 @@ Tasewti n awal agi n uɛaddi amaynut ad yaweḍ deg {{PLURAL:$5|yiwen ass|$5 uss
 
 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,
@@ -487,9 +519,23 @@ iwakken ad tbeyyneḍ belli tansa n email inek.',
 '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' => 'Beddel awal n uɛaddi',
@@ -502,13 +548,48 @@ iwakken ad tbeyyneḍ belli tansa n email inek.',
 'resetpass_submit' => 'Eg awal n tbaḍnit u kcem',
 'resetpass_success' => 'Awal n tbaḍnit yettubeddel! Qrib ad tkecmeḍ...',
 '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',
@@ -544,42 +625,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:'''",
@@ -587,17 +705,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.
@@ -616,43 +741,87 @@ 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:',
+'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 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',
@@ -676,7 +845,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
@@ -688,62 +857,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',
@@ -754,10 +1018,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',
@@ -769,62 +1035,99 @@ 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',
@@ -832,54 +1135,219 @@ i yesɛan akk awalen i banen-d).",
 '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.',
@@ -904,11 +1372,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',
@@ -923,68 +1394,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',
@@ -995,38 +1622,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',
@@ -1042,97 +1726,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',
@@ -1140,6 +1877,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)',
@@ -1149,50 +1887,105 @@ 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-line' => '$1 yeqqen seg $2',
 
 # 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-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',
@@ -1202,17 +1995,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.',
@@ -1221,13 +2017,14 @@ 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',
@@ -1238,27 +2035,35 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 '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
@@ -1268,7 +2073,9 @@ 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}} :',
 'actioncomplete' => 'Axdam yekfa',
 'actionfailed' => 'Tigawt agi texser',
 'deletedtext' => '"$1" yettumḥa.
@@ -1278,14 +2085,23 @@ 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',
+'delete-edit-reasonlist' => 'Beddel tiɣẓinin n umḥu n usebter',
 
 # 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.',
@@ -1293,33 +2109,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)',
 
@@ -1336,10 +2192,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',
@@ -1365,41 +2226,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.
@@ -1428,7 +2319,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
@@ -1437,15 +2328,24 @@ 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ḥ',
 
@@ -1453,6 +2353,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 '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',
@@ -1479,9 +2380,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',
@@ -1548,12 +2449,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.',
 
@@ -1564,11 +2465,28 @@ 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',
+
 # 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"',
@@ -1586,8 +2504,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',
@@ -1598,11 +2517,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' => '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',
+
 # Bad image list
 'bad_image_list' => 'Amasal d-wagi :
 
@@ -1612,6 +2541,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
@@ -1629,11 +2560,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.',
@@ -1643,13 +2838,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ɣ.',
@@ -1657,25 +2854,31 @@ 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ḍ]',
@@ -1690,8 +2893,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 →',
@@ -1729,8 +2937,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' => '',
-'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}}.',
@@ -1756,7 +2964,7 @@ 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',
 
 # Special:SpecialPages
@@ -1775,4 +2983,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..6aeebf5 100644 (file)
@@ -408,7 +408,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Джыпсту уикӀыжауэ щыт.'''
 
-Уихьэжьыфыну {{grammar:genitive|{{SITENAME}}}} зыкъумгъэцӀыху иэ [[Special:UserLogin|зыкъегъэцӀыхун аргуэру]] уи цӀэмкӀэ иэ нэмыщӀымкӀэ.
+Уихьэжьыфыну {{grammar:genitive|{{SITENAME}}}} зыкъумгъэцӀыху иэ <span class='plainlinks'>[$1 зыкъегъэцӀыхун аргуэру]</span> уи цӀэмкӀэ иэ нэмыщӀымкӀэ.
 НапэкӀуэцӀ гуэрэхэр япэми хуэду къикӀыфынухэ, системэм уимыкӀыжьа хуэду. Апхуэду щымытын щхьэкӀэ браузэр кэшыр къэгъэщӀырыщӀын хуэй.",
 'welcomecreation' => '== Къеблагъэ, $1! ==
 Уи аккаунтыр хьэзырщ.
@@ -939,8 +939,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..04088c4 100644 (file)
@@ -386,7 +386,7 @@ MySQL جوابِ خطاء پرائے "$3: $4"',
 
 # Login and logout pages
 'logouttext' => "'''ھنیسے تو خارج بیتی آسوس'''<br />
-تو خفی الاسم {{SITENAME}}  استعمال جاری لاکھیکو بوس، یا دوبارہ ھیہ نامو یا مختلف نامان سورا داخل دی بیکو بوس۔  ھیہ یاد آوری کورے کہ ای کما صفحات ھش [[Special:UserLogin|دوباری لاگن بوس]] غیچھی گونی کہ تو ھنیسے خارج نو بیتی آسوس، کلہ پت کہ تو تان تفصحہ (براؤزرو) ابطن (cache) صاف نوکوروس۔\",",
+تو خفی الاسم {{SITENAME}}  استعمال جاری لاکھیکو بوس، یا دوبارہ ھیہ نامو یا مختلف نامان سورا داخل دی بیکو بوس۔  ھیہ یاد آوری کورے کہ ای کما صفحات ھش <span class='plainlinks'>[\$1 دوباری لاگن بوس]</span> غیچھی گونی کہ تو ھنیسے خارج نو بیتی آسوس، کلہ پت کہ تو تان تفصحہ (براؤزرو) ابطن (cache) صاف نوکوروس۔\",",
 'welcomecreation' => '== رحمت عزیز چترالی تتے خوشان گیے ریران، $1 ! ==
 
 تہ  کھاتہ ساوزینو بیتی شیر تو تان [[Special:Preferences|{{SITENAME}} ترجیحات]]ن مرتب کوریکو مو روخڅے.',
@@ -631,8 +631,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'''",
index cf9fff0..08bf1de 100644 (file)
@@ -447,7 +447,7 @@ 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.
@@ -766,8 +766,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',
index 89a7503..8e1f306 100644 (file)
@@ -520,7 +520,6 @@ $messages = array(
 'qbbrowse' => 'شولۋ',
 'qbedit' => 'وڭدەۋ',
 'qbpageoptions' => 'بۇل بەت',
-'qbpageinfo' => 'اينالا',
 'qbmyoptions' => 'بەتتەرىم',
 'qbspecialpages' => 'ارنايى بەتتەر',
 'faq' => 'ٴجىيى قويىلعان ساۋالدار',
@@ -1128,8 +1127,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' => 'قاتىستى',
index 286e1f7..2d4042f 100644 (file)
@@ -503,7 +503,6 @@ $messages = array(
 'qbbrowse' => 'Шолу',
 'qbedit' => 'Өңдеу',
 'qbpageoptions' => 'Бұл бет',
-'qbpageinfo' => 'Айнала',
 'qbmyoptions' => 'Беттерім',
 'qbspecialpages' => 'Арнайы беттер',
 'faq' => 'Жиі қойылған сауалдар',
@@ -756,7 +755,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Жүйеден шықтыңыз.'''
 
-Жүйеге кірместен де {{SITENAME}} жобасын пайдалана аласыз, немесе баяғы не өзге қатысушы ретінде жүйеге [[Special:UserLogin|қайта кіруіңізге]] болады.
+Жүйеге кірместен де {{SITENAME}} жобасын пайдалана аласыз, немесе баяғы не өзге қатысушы ретінде жүйеге <span class='plainlinks'>[$1 қайта кіруіңізге]</span> болады.
 Аңғартпа: Кейбір беттер шолғышыңыздың кэшін тазартқанша әлі де жүйеге кіріп отырғаныңыздай көрінуі мүмкін.",
 'welcomecreation' => '== Қош келдіңіз, $1! ==
 Жаңа тіркелгіңіз жасалды.
@@ -1274,8 +1273,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' => 'Белгіленген есім кеңістігінен іздеу',
@@ -3193,4 +3190,7 @@ $5
 'logentry-newusers-autocreate' => '$1 аккаунты автоматты түрде тіркелді',
 'newuserlog-byemail' => 'Құпия сөз e-mail арқылы жіберілді',
 
+# Search suggestions
+'searchsuggest-search' => 'Іздеу',
+
 );
index 5c3e0e2..9c491d9 100644 (file)
@@ -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',
@@ -1091,8 +1090,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ı',
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..77898c1 100644 (file)
@@ -406,7 +406,6 @@ $messages = array(
 'qbbrowse' => 'រាវរក',
 'qbedit' => 'កែប្រែ',
 'qbpageoptions' => 'ទំព័រនេះ',
-'qbpageinfo' => 'ព័ត៌មានទំព័រ',
 'qbmyoptions' => 'ទំព័ររបស់ខ្ញុំ',
 'qbspecialpages' => 'ទំព័រពិសេសៗ',
 'faq' => 'សំណួរដែលសួរញឹកញាប់',
@@ -419,7 +418,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 +632,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|ទំព័រ, ដែលមាន}} ដែលត្រូវបានការពារជាមួយជំរើស"ជាបណ្ដាក់"៖
@@ -657,7 +657,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ឥឡូវនេះលោកអ្នកបានកត់ឈ្មោះចេញពីគណនីរបស់លោកអ្នកហើយ។'''
 
-អ្នកអាចបន្តប្រើប្រាស់{{SITENAME}}ក្នុងភាពអនាមិក ឬ [[Special:UserLogin|កត់ឈ្មោះចូលម្ដងទៀត]]ក្នុងនាមជាអ្នកប្រើប្រាស់ដដែលឬផ្សេងទៀត។
+អ្នកអាចបន្តប្រើប្រាស់{{SITENAME}}ក្នុងភាពអនាមិក ឬ <span class='plainlinks'>[$1 កត់ឈ្មោះចូលម្ដងទៀត]</span>ក្នុងនាមជាអ្នកប្រើប្រាស់ដដែលឬផ្សេងទៀត។
 
 សូមកត់សំគាល់ថាទំព័រមួយចំនួនប្រហែលជានៅតែបង្ហាញដូចពេលលោកអ្នកកត់ឈ្មោះចូលក្នុងគណនីរបស់លោកអ្នកដដែល។ ប្រសិនបើមានករណីនេះកើតឡើង សូមសំអាត សតិភ្ជាប់នៃកម្មវិធីរុករករបស់លោកអ្នក។",
 'welcomecreation' => '== សូមស្វាគមន៍ $1! ==
@@ -952,7 +952,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>" មិនទាន់បានចុះបញ្ជី។
 
 ចូរគិតម្ដងទៀតថាអ្នកចង់ បង្កើត / កែប្រែ ទំព័រនេះឬទេ។',
@@ -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' => 'ស្វែងរកនៅក្នុងលំហឈ្មោះទាំងអស់',
@@ -2951,7 +2949,6 @@ $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)',
 
@@ -3628,6 +3625,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..de43d34 100644 (file)
@@ -437,7 +437,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ನೀವು ಈಗ ಲಾಗ್ ಔಟ್ ಆಗಿರುವಿರಿ.'''
 
-ನೀವು {{SITENAME}} ಅನ್ನು ಅನಾಮಧೇಯವಾಗಿ ಉಪಯೋಗಿಸಬಹುದು, ಅಥವ ಮತ್ತೆ ಇದೇ ಹೆಸರಿನಲ್ಲಿ ಅಥವ ಬೇರೆ ಹೆಸರಿನಲ್ಲಿ [[Special:UserLogin|ಲಾಗ್ ಇನ್]] ಆಗಬಹುದು.
+ನೀವು {{SITENAME}} ಅನ್ನು ಅನಾಮಧೇಯವಾಗಿ ಉಪಯೋಗಿಸಬಹುದು, ಅಥವ ಮತ್ತೆ ಇದೇ ಹೆಸರಿನಲ್ಲಿ ಅಥವ ಬೇರೆ ಹೆಸರಿನಲ್ಲಿ <span class='plainlinks'>[$1 ಲಾಗ್ ಇನ್]</span> ಆಗಬಹುದು.
 ಗಮನಿಸಿ: ನಿಮ್ಮ ಬ್ರೌಸರ್‍ನ cache ಅನ್ನು ಅಳಿಸುವವರೆಗೂ ಕೆಲವು ಪುಟಗಳು ನೀವಿನ್ನೂ ಲಾಗ್ ಇನ್ ಆಗಿರುವಂತೆ ಪ್ರದರ್ಶಿತವಾಗಬಹುದು.",
 'welcomecreation' => '== ಸುಸ್ವಾಗತ, $1! ==
 ನಿಮ್ಮ ಅಕೌಂಟನ್ನು ಸೃಷ್ಟಿಸಲಾಗಿದೆ.
@@ -845,8 +845,6 @@ $2',
 'search-interwiki-caption' => 'ಬಳಗದ ಇತರ ಯೋಜನೆಗಳು',
 'search-interwiki-default' => '$1 ಫಲಿತಾಂಶಗಳು:',
 'search-interwiki-more' => '(ಹೆಚ್ಚು)',
-'search-mwsuggest-enabled' => 'ಸಲಹೆಗಳೊಂದಿಗೆ',
-'search-mwsuggest-disabled' => 'ಯಾವುದೇ ಸಲಹೆಗಳಿಲ್ಲ',
 'search-relatedarticle' => 'ಸಂಬಂಧಿತ',
 'mwsuggest-disable' => 'AJAX ಸಲಹೆಗಳನ್ನು ತೋರದಿರು',
 'searchrelated' => 'ಸಂಬಂಧಿತ',
index 4194055..982feb7 100644 (file)
@@ -489,7 +489,6 @@ $messages = array(
 'qbbrowse' => '탐색',
 'qbedit' => '편집',
 'qbpageoptions' => '문서 기능',
-'qbpageinfo' => '문서 정보',
 'qbmyoptions' => '내 사용자 문서',
 'qbspecialpages' => '특수 문서',
 'faq' => '자주 묻는 질문',
@@ -502,7 +501,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' => '역사',
@@ -522,7 +521,7 @@ $messages = array(
 'searcharticle' => '가기',
 'history' => '문서 역사',
 'history_short' => '역사',
-'updatedmarker' => '마지막으로 읽은 뒤 바뀌었음',
+'updatedmarker' => '마지막으로 방문한 뒤 바뀜',
 'printableversion' => '인쇄용 문서',
 'permalink' => '고유링크',
 'print' => '인쇄',
@@ -755,7 +754,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''{{SITENAME}}에서 로그아웃했습니다.'''
 
-이대로 이름 없이 {{SITENAME}}을(를) 이용하거나, 방금 사용했던 계정이나 다른 계정으로 다시 [[Special:UserLogin|로그인]]해서 이용할 수 있습니다.
+이대로 이름 없이 {{SITENAME}}을(를) 이용하거나, 방금 사용했던 계정이나 다른 계정으로 다시 <span class='plainlinks'>[$1 로그인]</span>해서 이용할 수 있습니다.
 웹 브라우저의 캐시를 지우지 않으면 몇몇 문서에서 로그인이 되어 있는 것처럼 보일 수 있다는 점을 유의해 주세요.",
 'welcomecreation' => '== $1 님, 환영합니다! ==
 계정이 만들어졌습니다.
@@ -947,7 +946,7 @@ $2
 'hr_tip' => '가로 줄 (되도록 사용하지 말아 주세요)',
 
 # Edit pages
-'summary' => '편집 요약:',
+'summary' => '요약:',
 'subject' => '주제/제목:',
 'minoredit' => '사소한 편집',
 'watchthis' => '이 문서 주시하기',
@@ -964,7 +963,7 @@ $2
 'missingcommenttext' => '아래에 내용을 채워 넣어 주세요.',
 'missingcommentheader' => "'''알림:''' 글의 제목을 입력하지 않았습니다.
 다시 \"{{int:savearticle}}\" 버튼을 클릭하면 글이 제목 없이 저장됩니다.",
-'summary-preview' => '편집 요약 미리 보기:',
+'summary-preview' => '요약 미리 보기:',
 'subject-preview' => '주제/제목 미리 보기:',
 'blockedtitle' => '차단됨',
 'blockedtext' => "'''당신의 계정 혹은 IP 주소가 차단되었습니다.'''
@@ -1137,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' => "'''경고:''' 이 문서는 너무 많은 파서 함수를 포함하고 있습니다.
@@ -1395,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' => '모든 이름공간에서 찾기',
@@ -2069,7 +2075,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 되돌리기',
@@ -2387,6 +2393,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 # User Messenger
 'usermessage-summary' => '시스템 메시지 남기기',
 'usermessage-editor' => '시스템 메신저',
+'usermessage-template' => 'MediaWiki:UserMessage',
 
 # Watchlist
 'watchlist' => '주시문서 목록',
@@ -2502,8 +2509,8 @@ $UNWATCHURL
 'rollback' => '편집 되돌리기',
 'rollback_short' => '되돌리기',
 'rollbacklink' => '되돌리기',
-'rollbacklinkcount' => '되돌리기 편집 $1회',
-'rollbacklinkcount-morethan' => '되돌리기 편집 $1회 이상',
+'rollbacklinkcount' => '편집 $1회 되돌리기',
+'rollbacklinkcount-morethan' => '편집 $1회 이상 되돌리기',
 'rollbackfailed' => '되돌리기 실패',
 'cantrollback' => '편집을 되돌릴 수 없습니다.
 문서를 편집한 사용자가 한명뿐입니다.',
@@ -2620,8 +2627,8 @@ $UNWATCHURL
 'undeletedrevisions' => '판 $1개를 복구했습니다',
 'undeletedrevisions-files' => '판 $1개와 파일 $2개를 복구했습니다.',
 'undeletedfiles' => '파일 $1개를 복구했습니다',
-'cannotundelete' => '복구에 실패했습니다.
-다른 사용자가 이미 복구했을 수도 있습니다.',
+'cannotundelete' => '복구하는 데 실패했습니다:
+$1',
 'undeletedpage' => "'''$1 문서를 복구했습니다.'''
 
 [[Special:Log/delete|삭제 기록]]에서 최근의 삭제와 복구 기록을 볼 수 있습니다.",
@@ -2638,7 +2645,7 @@ $UNWATCHURL
 이미 복구되었을 수 있습니다.',
 'undelete-error' => '문서 복구 중 오류',
 'undelete-error-short' => '파일 복구 오류: $1',
-'undelete-error-long' => '파일을 복구하는  오류가 발생했습니다:
+'undelete-error-long' => '파일을 복구하는 동안 오류가 발생했습니다:
 
 $1',
 'undelete-show-file-confirm' => '정말 "<nowiki>$1</nowiki>" 파일의 삭제된 $2 $3 버전을 보시겠습니까?',
@@ -2679,6 +2686,7 @@ $1',
 'sp-contributions-username' => 'IP 주소 또는 사용자 이름:',
 'sp-contributions-toponly' => '최신판만 보기',
 'sp-contributions-submit' => '찾기',
+'sp-contributions-explain' => '',
 
 # What links here
 'whatlinkshere' => '여기를 가리키는 문서',
@@ -2930,6 +2938,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' => '새 파일의 확장자가 원래의 확장자와 일치하지 않습니다.',
@@ -3059,7 +3068,6 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 # JavaScriptTest
 'javascripttest' => '자바스크립트 테스트',
-'javascripttest-disabled' => '이 기능은 비활성되어 있습니다.',
 'javascripttest-title' => '$1 테스트 실행',
 'javascripttest-pagetext-noframework' => '이 페이지는 자바스크립트 테스트를 실행하기 위한 용도로 할당되어 있습니다.',
 'javascripttest-pagetext-unknownframework' => '실험용 프레임워크 "$1"를 알 수 없습니다.',
@@ -3200,6 +3208,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 # Info page
 'pageinfo-title' => '"$1" 문서에 대한 정보',
+'pageinfo-not-current' => '정보는 현재 판만을 보여줄 수 있습니다.',
 'pageinfo-header-basic' => '기본 정보',
 'pageinfo-header-edits' => '편집 역사',
 'pageinfo-header-restrictions' => '문서 보호',
@@ -3223,12 +3232,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' => '클래식',
@@ -3829,6 +3845,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[인터위키가 비활성되어 있습니다]',
 'scarytranscludefailed' => '[$1 틀을 불러오는 데에 실패했습니다]',
+'scarytranscludefailed-httpstatus' => '[$1 틀을 가져오는 데 실패했습니다: HTTP $2]',
 'scarytranscludetoolong' => '[URL이 너무 깁니다]',
 
 # Delete conflict
@@ -4103,6 +4120,10 @@ $5
 'feedback-bugcheck' => '감사합니다! 혹시 해당 사항이 [$1 기존의 버그 보고서]에 올라와 있는지 확인해주세요.',
 'feedback-bugnew' => '확인했습니다. 새로운 버그 보고서를 작성합니다.',
 
+# Search suggestions
+'searchsuggest-search' => '찾기',
+'searchsuggest-containing' => '다음의 어구가 들어간 문서 찾기',
+
 # API errors
 'api-error-badaccess-groups' => '당신은 이 위키에 파일을 올릴 권한이 없습니다.',
 'api-error-badtoken' => '내부 오류: 토큰이 잘못되었습니다.',
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..6ba2d82 100644 (file)
@@ -184,7 +184,6 @@ $messages = array(
 'qbbrowse' => 'Къарау',
 'qbedit' => 'Тюрлендир',
 'qbpageoptions' => 'Бу бет',
-'qbpageinfo' => 'Бетни юсюнден',
 'qbmyoptions' => 'Бетлерим',
 'qbspecialpages' => 'Къуллукъчу бетле',
 'faq' => 'FAQ',
@@ -428,7 +427,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Аккаунтугъуздан чыкъдыгъыз.'''
 
-Сиз {{SITENAME}} сайтда аноним халда къалыргъа боллкъсуз. неда [[Special:UserLogin|джангыдан кирирге]].
+Сиз {{SITENAME}} сайтда аноним халда къалыргъа боллкъсуз. неда <span class='plainlinks'>[$1 джангыдан кирирге]</span>.
 Талай бетле сиз тергеу джазыу (аккаунт) бла киргенча кёрюнюрге боллукъдула, аны кетерир ючюн кэшни джангыртыгъыз.",
 'welcomecreation' => '== Хош келигиз, $1!  ==
 Сизни тергеу джазыуугъуз (аккаунтугъуз) къуралды.
@@ -987,8 +986,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' => 'Атланы бютёу аламларында изле',
@@ -3435,6 +3432,10 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'feedback-error2' => 'Халат. Тюзетиу ётмеди',
 'feedback-close' => 'Тындырылды',
 
+# Search suggestions
+'searchsuggest-search' => 'Излеу',
+'searchsuggest-containing' => 'ичиндегиси…',
+
 # API errors
 'api-error-badtoken' => 'Ич халат: терс токен.',
 'api-error-duplicate-popup-title' => ' {{PLURAL:$1|Файлны|Файлны}} дубликаты',
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..3640f33 100644 (file)
@@ -32,15 +32,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 +48,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 +75,7 @@ $messages = array(
 # Upload
 'filedesc' => 'خُلاسہٕ',
 
-'sp-contributions-talk'   => 'بَحَژ',
+'sp-contributions-talk' => 'بَحَژ',
 'sp-contributions-submit' => 'ژھارُن',
 
 # Namespace 8 related
index e6f8f42..7297900 100644 (file)
@@ -356,7 +356,6 @@ $messages = array(
 'qbbrowse' => 'Aanluure',
 'qbedit' => 'Ändere',
 'qbpageoptions' => 'Sigge Enstellunge',
-'qbpageinfo' => 'Üvver de Sigg',
 'qbmyoptions' => 'Ming Sigge',
 'qbspecialpages' => 'Spezial Sigge',
 'faq' => 'FAQ',
@@ -369,7 +368,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,7 +634,7 @@ 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.
@@ -1346,8 +1345,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',
@@ -1542,11 +1539,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',
@@ -3066,7 +3063,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.',
@@ -3231,10 +3227,10 @@ 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',
 
 # Skin names
 'skinname-standard' => 'Klassesch',
@@ -3844,7 +3840,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
@@ -4170,6 +4167,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.',
index 4f098a6..93f517c 100644 (file)
@@ -237,7 +237,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 +304,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.',
@@ -451,7 +450,7 @@ $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! ==
 
@@ -838,8 +837,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û',
@@ -1601,8 +1598,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',
 
@@ -2049,7 +2047,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 +2147,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..2059a32 100644 (file)
@@ -551,8 +551,6 @@ Alhwedh: '''({{int:cur}})''' = dyffrans gans an amendyans diwettha, '''({{int:la
 'search-interwiki-caption' => 'Ragdresow hwor',
 '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',
@@ -1109,4 +1107,8 @@ Y hellir gweles hy fednfenten.',
 # Special:Tags
 'tags-edit' => 'chanjya',
 
+# Search suggestions
+'searchsuggest-search' => 'Hwilas',
+'searchsuggest-containing' => 'ow senji...',
+
 );
index 726c146..ec9c19b 100644 (file)
@@ -474,8 +474,6 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 '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''' жыйынтык}}",
index 961b81f..9b37238 100644 (file)
@@ -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,7 +493,7 @@ 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.
@@ -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',
@@ -2384,4 +2381,7 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
 'logentry-newusers-autocreate' => 'Ratio $1 automatice creata est',
 'newuserlog-byemail' => 'tessera missa litteris electronicis',
 
+# Search suggestions
+'searchsuggest-search' => 'Quaerere',
+
 );
index f2bccbf..2a4f304 100644 (file)
@@ -692,8 +692,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'''",
index f52d705..5320d30 100644 (file)
@@ -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',
@@ -586,7 +585,7 @@ $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! ==
@@ -835,6 +834,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.',
@@ -934,6 +937,13 @@ 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',
+'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.
@@ -1182,8 +1192,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',
@@ -1760,7 +1768,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 +1821,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 +1883,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',
@@ -2003,6 +2011,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',
@@ -2357,7 +2366,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.",
@@ -2769,6 +2779,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 +2792,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,11 +2908,13 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
 
 # Info page
 'pageinfo-title' => 'Informatioun iwwer "$1"',
+'pageinfo-not-current' => 'Dës Informatioune kënnen nëmme fir dës Versioun gewise ginn.',
 '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-views' => 'Zuel vun de Kéieren déi dës Säit gekuckt gouf',
@@ -2916,10 +2929,13 @@ 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-yes' => 'Jo',
 
 # Skin names
 'skinname-standard' => 'Klassesch',
@@ -3176,6 +3192,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 +3496,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
@@ -3744,6 +3762,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..d6e15d9 100644 (file)
@@ -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' => 'вири',
index 024c56a..2ff608d 100644 (file)
@@ -443,8 +443,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',
 
index 88b41b4..1a928c7 100644 (file)
@@ -400,7 +400,7 @@ 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 />
@@ -844,8 +844,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..f0c2282 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,7 +557,7 @@ 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.
@@ -1147,8 +1146,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',
@@ -2730,7 +2727,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 +3674,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..b816058 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',
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..adaa3c1 100644 (file)
@@ -420,7 +420,7 @@ 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}}]].",
@@ -628,8 +628,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á',
index bf0b9d6..1495086 100644 (file)
@@ -340,8 +340,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.",
index 9669b31..a1ec10d 100644 (file)
@@ -483,8 +483,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' => 'ກ່ຽວຂ້ອງ',
index 762c1e8..333e04f 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',
 
index 0e446f3..4334317 100644 (file)
@@ -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,7 +587,7 @@ 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! ==
 
@@ -1178,8 +1177,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',
@@ -2778,7 +2775,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 +3747,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..c431b99 100644 (file)
@@ -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,7 +393,7 @@ $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.
@@ -731,8 +730,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 +1150,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.',
@@ -1934,4 +1931,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 92c89f8..f8e3bc9 100644 (file)
@@ -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',
@@ -429,7 +428,7 @@ 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! ==
 
@@ -933,8 +932,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',
@@ -3100,6 +3097,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..43ef687 100644 (file)
@@ -291,7 +291,6 @@ $messages = array(
 'qbbrowse' => '覽',
 'qbedit' => '纂',
 'qbpageoptions' => '此頁',
-'qbpageinfo' => '內文',
 'qbmyoptions' => '吾好',
 'qbspecialpages' => '非凡',
 'faq' => '頻答問',
@@ -521,7 +520,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''子去簿矣'''
 
-子可匿名還覽{{SITENAME}},或[[Special:UserLogin|復登]]同簿、異簿。
+子可匿名還覽{{SITENAME}},或<span class='plainlinks'>[$1 復登]</span>同簿、異簿。
 未清謄本,覽器文舊,且慎之。",
 'welcomecreation' => '== $1大駕光臨! ==
 子簿增矣,敬更[[Special:Preferences|簿註]]。',
@@ -998,8 +997,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' => '尋全名集',
index 7b37819..4c12a97 100644 (file)
@@ -368,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.",
index b9e2f49..98788e6 100644 (file)
@@ -170,7 +170,6 @@ $messages = array(
 'qbbrowse' => 'गवेषण करू',
 'qbedit' => 'सम्पादन करू',
 'qbpageoptions' => 'ई पन्ना',
-'qbpageinfo' => 'विषय',
 'qbmyoptions' => 'हमर पन्ना सभ',
 'qbspecialpages' => 'विशेष पन्ना सभ',
 'faq' => 'त्वरित प्रश्नोत्तरी',
@@ -422,7 +421,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''अहाँ निष्क्रमण कऽ गेल छी।'''
 
-अहाँ {{अन्तर्जाल}} प्रयोग अनाम भऽ कऽ सकै छी, वा अहाँ [[Special:UserLogin|log in again]] वएह आकि कोनो आन प्रयोक्ताक रूपमे सेहू प्रयोक कऽ सकै छी।
+अहाँ {{अन्तर्जाल}} प्रयोग अनाम भऽ कऽ सकै छी, वा अहाँ <span class='plainlinks'>[$1 log in again]</span> वएह आकि कोनो आन प्रयोक्ताक रूपमे सेहू प्रयोक कऽ सकै छी।
 ई मोन राखू जे किछु पन्ना एना देखा पड़ि सकैए जेना अहाँ अखनो सम्प्रवेशित होइ, जावत अहाँ अपन गवेषकक उपस्मृति मेटा नै दै छी।",
 'welcomecreation' => '== स्वागत अछि, $1! ==
 अहाँक खाता खुजि गेल अछि।
@@ -1018,8 +1017,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' => 'सभ नामस्थान सभमे ताकू',
index 1e462df..7b6732d 100644 (file)
@@ -409,7 +409,7 @@ 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! ==
 
@@ -885,8 +885,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..f7b70be 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,7 +546,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Тон лисеть.'''
 
-Тондейть ули кода ащемс {{SITENAME}}са апак содак эли [[Special:UserLogin|сувак тага весть]] кода сяка эли иля тиись.
+Тондейть ули кода ащемс {{SITENAME}}са апак содак эли <span class='plainlinks'>[$1 сувак тага весть]</span> кода сяка эли иля тиись.
 Кой-кона лопатне илядсть стамкс кодамкс синь ульсть тонь лисемада инголе мъзярс тонь интернет полатксце изь аруяфтов эсь ванфневи файлхнень эзда.",
 'welcomecreation' => '== Сувак, $1! ==
 
@@ -507,12 +555,15 @@ $2',
 '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 +572,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 +592,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 +605,7 @@ $2',
 
 Улендяряй киге иля кучсь тя вешфксть эли тон мяляфтсак тонь сувама валцень эди тонь тяни аш мяльце сонь полафтома, тят тие мезеге тя пачфтемась самда меле ди киртть тонь ингольдень сувама валцень.',
 'noemail' => '"$1" тиить электрононь адресоц аш.',
+'noemailcreate' => 'Эряви тяштемс афкукс е-парга',
 'passwordsent' => 'Од сувама валсь кучфоль "$1" тиить электрононь адресонцты.
 Сувак сонь кундамда меле.',
 'blocked-mailpassword' => 'Петнемат тиемась тонь IP адрестот кардаф. Сувама валть кемокстама функциес кундама аф мярьгови кальдяв тиемада аралама туфталонкса.',
@@ -560,15 +621,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 +652,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 +758,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 +770,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 +842,7 @@ $2',
 'edit-no-change' => 'Тонь петнемацень тевс изь нолда, сяс мес тон текстть ашеть полафта.',
 'edit-already-exists' => 'Аш кода од лопа ушедомс.
 Тя лопась ульсь ни.',
+'content-failed-to-parse' => 'Аш кода $2 сёрматфть нолдамс тевс $1 моделень коряс: $3',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Инголе кардама: Тя лопаса пяк лама питни синтаксонь анализаторхнень тяшкста.
@@ -801,6 +888,7 @@ $3 макссь туфталсь - ''$2''",
 Шарьхкотьфтема: (тян.) = тяниень верзиеда явомась,
 (сяд.) = сядынгольдень верзияда явомась, Ё = ёмла петнема.',
 'history-fieldset-title' => 'Вешентть история',
+'history-show-deleted' => 'Аньцек нардаф',
 'histfirst' => 'Кунардонь',
 'histlast' => 'Мекольце',
 'historysize' => '({{PLURAL:$1|1 байт|$1 байтт}})',
@@ -847,6 +935,8 @@ $3 макссь туфталсь - ''$2''",
 'revdelete-success' => "'''Верзиеть няевоманц одонзафозь лац.'''",
 'logdelete-success' => "'''Сёрматфть няевомац арафтовсь лац.'''",
 'revdel-restore' => 'Полафтомс няевомац',
+'revdel-restore-deleted' => 'нардаф верзиет',
+'revdel-restore-visible' => 'няеви верзиет',
 'pagehist' => 'Лопать историяц',
 'deletedhist' => 'Нардаф историяц',
 'revdelete-edit-reasonlist' => 'Петнемс нардамань туфталхне',
@@ -888,12 +978,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 +998,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 +1018,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 +1026,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 +1125,7 @@ $3 макссь туфталсь - ''$2''",
 'email' => 'Электрононь адресце',
 'prefs-help-realname' => 'Афкуксонь лемце путомась аф лувови эрявикс. Афкуксонь лемцень тязк путомада меле тонь лемце кармай эвондама лопаса тонь петнемацень ала.',
 'prefs-help-email' => 'Электрононь адресце тяса аф лувови эрявикс, интай юкстандярят сувама валце адресце путомась лезды сонь полафтоманди.',
+'prefs-help-email-others' => 'Тондейть ули кода путомс корхнема лопазот е-паргцень, конань вельде иля ломатне сёрмадовихть тейть. Е-паргце аф кармай няеви мзярда иля тиихне тяшнелихть тейть.',
 'prefs-help-email-required' => 'Эряви электрононь адресце.',
 
 # User rights
@@ -1182,6 +1276,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 +1444,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 +1453,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 +1595,7 @@ $3 макссь туфталсь - ''$2''",
 'listusers' => 'Тиихне',
 'listusers-editsonly' => 'Няфтемс аньцек петнематнень мархта тиихнень',
 'usereditcount' => '$1 {{PLURAL:$1|петнема|петнемат}}',
+'usercreated' => '{{GENDER:$3|Шкаф}} $1 шиста $2 пингста',
 'newpages' => 'Од лопат',
 'newpages-username' => 'Тиить лемоц:',
 'ancientpages' => 'Сембода сире лопат',
@@ -1619,6 +1720,7 @@ $3 макссь туфталсь - ''$2''",
 # Watchlist
 'watchlist' => 'Монь мельгеваномазе',
 'mywatchlist' => 'Монь мельгеваномазе',
+'watchlistfor2' => '$1 $2-нди',
 'nowatchlist' => 'Мезеге аш тонь мельгеваномасот.',
 'watchlistanontext' => '$1 тонь ванома мельгеваномаста лопат ваноманкса эли петнеманкса.',
 'watchnologin' => 'Апак сувак',
@@ -1700,6 +1802,7 @@ $UNWATCHURL
 'confirmdeletetext' => 'Тон сърхкать нардамс лопать сембе сонь историянц мархта.
 Эняльттяма, кемокстак тон афкукс ёрат тянь тиемс, эди тон шарьхкодьсак мезе лиси тяда меле, ди тон сембе тянь тисак [[{{MediaWiki:Policy-url}}|политик]] коряс.',
 'actioncomplete' => 'Тевонь тиемась анок',
+'actionfailed' => 'Тиемась изь лисе',
 'deletedtext' => 'Лопась "$1" нардафоль. Ванк $2 мекольце нардаматнень няфтеманкса.',
 'dellogpage' => 'Нардамань лувома',
 'dellogpagetext' => 'Ватт сяда мекольце нардаматнень лувомась ала.',
@@ -1812,6 +1915,7 @@ $UNWATCHURL
 'undelete-nodiff' => 'Сядынгольдень верзиет исть мув.',
 'undeletebtn' => 'Мърдафтомс',
 'undeletelink' => 'ваномс/мърдафтомс',
+'undeleteviewlink' => 'ваномс',
 'undeletereset' => 'Валхтомс',
 'undeleteinvert' => 'Валхтомс кочкама',
 'undeletecomment' => 'Мяльполаткс:',
@@ -1858,10 +1962,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 +2196,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 +2205,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 +2219,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 +2249,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 +2328,7 @@ $1',
 'tooltip-rollback' => '"Потафтфкс" мърдафтсыне петнематне мекольце тиинь путксонц лопазонза фкя люпштамас.',
 'tooltip-undo' => '"Каряньфтема" мърдафтсыне тя петнемать эди панжесы петнема форм васень няфтемаса.
 Лезни поладомс туфталхт лихтемать эс.',
+'tooltip-summary' => 'Тяштьк нюрьхкяняста сувафтфть колга',
 
 # Metadata
 'notacceptable' => 'Вики серверонди аш кода максомс информациесь стама форматса конань эса тонь клиентти ули кода сонь морафтомс.',
@@ -2767,6 +2889,9 @@ $5
 
 #Путт сембе васу валзюлмафксонь пакшензон тя луфть (строкать) вельфке. Катт тя луфть (строкать) стамкс кодамкс сон ульсь</pre>',
 
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Tag]] педямась:',
+
 # New logging system
 'revdelete-restricted' => 'нолдаф тевс кардафксне системонь вятиксненди',
 'revdelete-unrestricted' => 'системонь вятиксненди кардафксне валхтфт',
index 752f7ec..b537a3e 100644 (file)
@@ -361,7 +361,6 @@ $messages = array(
 'qbbrowse' => 'Tadiavina',
 'qbedit' => 'Hanova',
 'qbpageoptions' => 'Ity pejy ity',
-'qbpageinfo' => 'Pejy fanoroana',
 'qbmyoptions' => 'Ny pejiko',
 'qbspecialpages' => 'Pejy manokana',
 'faq' => 'FMM',
@@ -601,6 +600,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,7 +611,7 @@ 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! ==
 
@@ -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.
@@ -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:",
@@ -1695,10 +1695,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.',
@@ -1959,6 +1961,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 +2015,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 +2033,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',
@@ -2091,6 +2099,7 @@ 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-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.
index 2e6cc29..46b691a 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' => 'Кусараш',
@@ -879,6 +878,7 @@ $messages = array(
 'whatlinkshere-hideredirs' => 'вес вере колтымаш-влакым $1',
 'whatlinkshere-hidetrans' => 'пуртымашым $1',
 'whatlinkshere-hidelinks' => 'кылвер-влакым $1',
+'whatlinkshere-hideimages' => 'сӱрет деке кылвер-влакым $1',
 'whatlinkshere-filters' => 'Фильтр-влак',
 
 # Block/unblock
@@ -937,6 +937,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..b5f7718 100644 (file)
@@ -400,7 +400,7 @@ 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! ==
 
@@ -810,8 +810,6 @@ Legend: '''({{int:kini}})''' = perbedaan jo revisi terakhir, '''({{int:dulu}})''
 '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',
 'showingresultsheader' => "{{PLURAL:$5|Hasil '''$1''' dari '''$3'''|Hasil '''$1 - $2''' dari '''$3'''}} untuak '''$4'''",
@@ -1259,4 +1257,8 @@ Nan lainnyo akan tasuruak sacaro default.
 # Special:Tags
 'tag-filter' => '[[Special:Tags|Tag]] bateh:',
 
+# Search suggestions
+'searchsuggest-search' => 'Cari',
+'searchsuggest-containing' => 'Barisi...',
+
 );
index b16b10c..b8c9f72 100644 (file)
@@ -491,7 +491,6 @@ $messages = array(
 'qbbrowse' => 'Прелистај',
 'qbedit' => 'Уреди',
 'qbpageoptions' => 'Оваа страница',
-'qbpageinfo' => 'Содржина на страница',
 'qbmyoptions' => 'Мои страници',
 'qbspecialpages' => 'Специјални страници',
 'faq' => 'ЧПП',
@@ -504,7 +503,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' => 'Историја',
@@ -566,7 +565,7 @@ $messages = array(
 'lastmodifiedat' => 'Оваа страница последен пат е изменета на $1 во $2 ч.',
 'viewcount' => 'Оваа страница била посетена {{PLURAL:$1|еднаш|$1 пати}}.',
 'protectedpage' => 'Заштитена страница',
-'jumpto' => 'Скокни на:',
+'jumpto' => 'Ð\9fÑ\80еÑ\98ди на:',
 'jumptonavigation' => 'содржини',
 'jumptosearch' => 'барај',
 'view-pool-error' => 'За жал во моментов опслужувачите се преоптоварени.
@@ -761,7 +760,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Сега сте одјавени.'''
 
-Можете да продолжите со користење на {{SITENAME}} анонимно или можете [[Special:UserLogin|повторно да се најавите]] под исто или различно корисничко име.
+Можете да продолжите со користење на {{SITENAME}} анонимно или можете <span class='plainlinks'>[$1 повторно да се најавите]</span> под исто или различно корисничко име.
 Да напоменеме дека некои страници може да продолжат да се прикажуваат како да сте најавени, се додека не го исчистите кешот на вашиот прелистувач.",
 'welcomecreation' => '== Добредојдовте, $1! ==
 Вашата корисничка сметка е создадена.
@@ -1142,6 +1141,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 функции.
@@ -1395,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' => 'Барај во сите именски простори',
@@ -2066,7 +2072,7 @@ $1',
 'shared-repo' => 'заедничко складиште',
 'shared-repo-name-wikimediacommons' => 'Заедничката Ризница',
 'filepage.css' => '/* Тука поставените каскадни стилски страници (CSS) се вклучени во страницата за опис на податотеката, како и на клиентските викија */',
-'upload-disallowed-here' => 'Нажалост, не можете да ја замените сликава со нова.',
+'upload-disallowed-here' => 'Нажалост, не можете да презапишете врз сликава.',
 
 # File reversion
 'filerevert' => 'Врати $1',
@@ -2619,7 +2625,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|дневникот на бришења]] за попис на претходни бришења и обновувања.",
@@ -2928,6 +2935,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 +3065,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Проба на JavaScript',
-'javascripttest-disabled' => 'Функцијата не е овозможена на ова вики.',
 'javascripttest-title' => 'Вршам $1 проби',
 'javascripttest-pagetext-noframework' => 'Оваа страница е резервирана за вршење на проби со JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Непозната рамка „$1“.',
@@ -3197,6 +3204,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Информации за „$1“',
+'pageinfo-not-current' => 'Информациите може да се прикажат само за тековната ревизија.',
 'pageinfo-header-basic' => 'Основни информации',
 'pageinfo-header-edits' => 'Историја на уредувања',
 'pageinfo-header-restrictions' => 'Заштита на страницата',
@@ -3222,10 +3230,14 @@ $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' => 'Да',
 
 # Skin names
 'skinname-standard' => 'Класично',
@@ -3879,6 +3891,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[Превметнувањето помеѓу викијата е оневозможено]',
 'scarytranscludefailed' => '[Преземањето на шаблонот за $1 не успеа]',
+'scarytranscludefailed-httpstatus' => '[Преземањето на шаблонот не успеа за $1: HTTP $2]',
 'scarytranscludetoolong' => '[Премногу долго URL]',
 
 # Delete conflict
@@ -4124,7 +4137,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 +4189,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',
@@ -4239,6 +4252,10 @@ $5
 'feedback-bugcheck' => 'Одлично! Само проверете да не е една од [$1 веќе познатите грешки].',
 'feedback-bugnew' => 'Проверив. Пријави ја како нова грешка.',
 
+# Search suggestions
+'searchsuggest-search' => 'Пребарување',
+'searchsuggest-containing' => 'содржи...',
+
 # API errors
 'api-error-badaccess-groups' => 'Не ви е дозволено да подигате податотеки на ова вики.',
 'api-error-badtoken' => 'Внатрешна грешка: неисправен жетон.',
index 7226cc4..fc159a1 100644 (file)
@@ -472,7 +472,6 @@ $messages = array(
 'qbbrowse' => 'ബ്രൗസ്',
 'qbedit' => 'തിരുത്തുക',
 'qbpageoptions' => 'ഈ താൾ',
-'qbpageinfo' => 'സന്ദർഭം',
 'qbmyoptions' => 'എന്റെ താളുകൾ',
 'qbspecialpages' => 'പ്രത്യേക താളുകൾ',
 'faq' => 'പതിവുചോദ്യങ്ങൾ',
@@ -485,7 +484,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' => 'നാൾവഴി കാണുക',
@@ -736,7 +735,7 @@ $2',
 'logouttext' => "'''താങ്കൾ ഇപ്പോൾ {{SITENAME}} സംരംഭത്തിൽനിന്നും ലോഗൗട്ട് ചെയ്തിരിക്കുന്നു'''
 
 അജ്ഞാതമായിരുന്നു കൊണ്ട് {{SITENAME}} സം‌രംഭം താങ്കൾക്കു തുടർന്നും ഉപയോഗിക്കാവുന്നതാണ്‌.
-അല്ലെങ്കിൽ  [[Special:UserLogin|ലോഗിൻ സൗകര്യം ഉപയോഗിച്ച്]] വീണ്ടും ലോഗിൻ ചെയ്യാവുന്നതും ആണ്‌.
+അല്ലെങ്കിൽ  <span class='plainlinks'>[$1 ലോഗിൻ സൗകര്യം ഉപയോഗിച്ച്]</span> വീണ്ടും ലോഗിൻ ചെയ്യാവുന്നതും ആണ്‌.
 താങ്കൾ വെബ് ബ്രൌസറിന്റെ ക്യാഷെ ശൂന്യമാക്കിയിട്ടില്ലെങ്കിൽ ചില താളുകളിൽ താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കുന്നതായി കാണിക്കാൻ സാധ്യതയുണ്ട്.",
 'welcomecreation' => '== സ്വാഗതം, $1! ==
 താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു.
@@ -1076,6 +1075,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 +1340,6 @@ $1",
 'search-interwiki-caption' => 'സഹോദര സംരംഭങ്ങൾ',
 'search-interwiki-default' => '$1 ഫലങ്ങൾ:',
 'search-interwiki-more' => '(കൂടുതൽ)',
-'search-mwsuggest-enabled' => 'നിർദ്ദേശങ്ങൾ വേണം',
-'search-mwsuggest-disabled' => 'നിർദ്ദേശങ്ങൾ വേണ്ട',
 'search-relatedarticle' => 'ബന്ധപ്പെട്ടവ',
 'mwsuggest-disable' => 'അജാക്സ് നിർദ്ദേശങ്ങൾ വേണ്ട',
 'searcheverything-enable' => 'എല്ലാ നാമമേഖലകളും തിരയുക',
@@ -1978,7 +1984,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 തിരസ്ക്കരിക്കുക',
@@ -2517,7 +2523,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|മായ്ക്കൽ ലോഗ്]] കാണുക.",
@@ -2823,6 +2830,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 +2958,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'ജാവാസ്ക്രിപ്റ്റ് പരീക്ഷണം',
-'javascripttest-disabled' => 'ഈ വിക്കിയിൽ ഈ പ്രക്രിയ സജ്ജമാക്കിയിട്ടില്ല.',
 'javascripttest-title' => '$1 പരീക്ഷണങ്ങൾ നടക്കുന്നുണ്ട്',
 'javascripttest-pagetext-noframework' => 'ഈ താൾ ജാവാസ്ക്രിപ്റ്റ് പരീക്ഷണങ്ങൾ നടത്താനായി മാറ്റിവെച്ചിരിക്കുന്നതാണ്.',
 'javascripttest-pagetext-unknownframework' => 'അപരിചിതമായ പരീക്ഷണ ചട്ടക്കൂട് "$1".',
@@ -3080,6 +3087,7 @@ $1',
 
 # Info page
 'pageinfo-title' => '"$1" എന്ന താളിന്റെ വിവരങ്ങൾ',
+'pageinfo-not-current' => 'ഇപ്പോഴത്തെ നാൾപ്പതിപ്പിൽ മാത്രമേ വിവരങ്ങൾ പ്രദർശിപ്പിക്കപ്പെടാനിടയുള്ളു.',
 'pageinfo-header-basic' => 'അടിസ്ഥാനവിവരങ്ങൾ',
 'pageinfo-header-edits' => 'തിരുത്തൽചരിത്രം',
 'pageinfo-header-restrictions' => 'സംരക്ഷണം',
@@ -3104,10 +3112,14 @@ $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' => 'അതെ',
 
 # Skin names
 'skinname-standard' => 'സാർവത്രികം',
@@ -3676,6 +3688,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[അന്തർവിക്കി ഉൾപ്പെടുത്തൽ സജ്ജമല്ല]',
 'scarytranscludefailed' => '[$1-നു ഫലകം കണ്ടുപിടിക്കാൻ പറ്റിയില്ല]',
+'scarytranscludefailed-httpstatus' => '[$1-നു ഫലകം എടുക്കാൻ കഴിഞ്ഞില്ല: എച്ച്.റ്റി.റ്റി.പി. $2]',
 'scarytranscludetoolong' => '[വളരെ നീളക്കൂടുതലുള്ള യൂ.ആർ.എൽ.]',
 
 # Delete conflict
@@ -3962,6 +3975,10 @@ $5
 'feedback-bugcheck' => 'കൊള്ളാം! [$1 അറിയാവുന്ന ബഗുകളിൽ] ഒന്നല്ല എന്ന് ഒന്നു പരിശോധിച്ചേക്കുക.',
 'feedback-bugnew' => 'ഞാൻ പരിശോധിച്ചു. പുതിയൊരു ബഗ് ചേർക്കുക',
 
+# Search suggestions
+'searchsuggest-search' => 'തിരയുക',
+'searchsuggest-containing' => 'ഉൾപ്പെടുന്നവ...',
+
 # API errors
 'api-error-badaccess-groups' => 'ഈ വിക്കിയിൽ പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യാൻ താങ്കൾക്കനുവാദമില്ല.',
 'api-error-badtoken' => 'ആന്തരിക പിഴവ്: ഗുണകരമല്ലാത്ത ചീട്ട്.',
index 1ddb365..ab2a010 100644 (file)
@@ -186,7 +186,6 @@ $messages = array(
 'qbbrowse' => 'Дэлгэх',
 'qbedit' => 'Засварлах',
 'qbpageoptions' => 'Энэ хуудас',
-'qbpageinfo' => 'Агуулга',
 'qbmyoptions' => 'Миний хуудсууд',
 'qbspecialpages' => 'Тусгай хуудсууд',
 'faq' => 'Тогтмол тавигддаг асуултууд',
@@ -437,7 +436,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Та одоо гарлаа.'''
 
-Та ямар нэг хэрэглэгчийн бүртгэлгүйгээр {{SITENAME}}-г ашиглах боломжтой, эсвэл саяынхаа болон өөр хэрэглэгчийн бүртгэлээ ашиглан [[Special:UserLogin|дахин нэвтэрч]] болно.
+Та ямар нэг хэрэглэгчийн бүртгэлгүйгээр {{SITENAME}}-г ашиглах боломжтой, эсвэл саяынхаа болон өөр хэрэглэгчийн бүртгэлээ ашиглан <span class='plainlinks'>[$1 дахин нэвтэрч]</span> болно.
 Броузерийнхаа хийсвэр санах ойг цэвэрлэх хүртэл зарим нэг хуудсууд нь таны холбогдсон байдлаар харагдаж болзошгүйг анхааруулъя.",
 'welcomecreation' => '= $1, тавтай морилно уу! ==
 Та амжилттай бүртгэгдлээ.
@@ -1031,8 +1030,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' => 'Бүх нэрний зайнуудад хайх',
@@ -3309,4 +3306,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 b66f5d8..ad74677 100644 (file)
@@ -464,7 +464,6 @@ $messages = array(
 'qbbrowse' => 'न्याहाळा',
 'qbedit' => 'संपादन',
 'qbpageoptions' => 'हे पान',
-'qbpageinfo' => 'सामग्री',
 'qbmyoptions' => 'माझी पाने',
 'qbspecialpages' => 'विशेष पाने',
 'faq' => 'नेहमीची प्रश्नावली',
@@ -708,7 +707,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''तुम्ही आता अदाखल झाला(logout)आहात.'''
 
-तुम्ही अनामिकपणे {{SITENAME}}चा उपयोग करत राहू शकता, किंवा त्याच अथवा वेगळ्या सदस्य नावाने [[Special:UserLogin| पुन्हा दाखल होऊ शकता]].
+तुम्ही अनामिकपणे {{SITENAME}}चा उपयोग करत राहू शकता, किंवा त्याच अथवा वेगळ्या सदस्य नावाने <span class='plainlinks'>[$1  पुन्हा दाखल होऊ शकता]</span>.
 आपण स्वत:च्या न्याहाळकाची सय (cache) रिकामी करत नाही तो पर्यंत काही पाने आपण अजून दाखल आहात, असे नुसतेच दाखवत राहू शकतील.",
 'welcomecreation' => '== सुस्वागतम, $1! ==
 
@@ -1273,8 +1272,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' => 'सर्वनामविश्वांमध्ये शोधा:',
@@ -2829,7 +2826,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'जावा स्क्रिप्ट तपासणी',
-'javascripttest-disabled' => 'हे कार्य अवरूद्ध केले आहे.',
 'javascripttest-title' => '$1 टेस्ट चालू आहेत',
 'javascripttest-pagetext-noframework' => 'हे पान जावा स्क्रिप्ट तपासणी साठी सुरक्षित केले आहे',
 'javascripttest-pagetext-unknownframework' => 'अज्ञात तपासणीचे ठिकाण $1',
@@ -3780,6 +3776,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 d6dec2f..9b2d5fe 100644 (file)
@@ -338,7 +338,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 +350,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',
@@ -603,7 +602,7 @@ 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.",
+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.",
 'welcomecreation' => '== Selamat datang, $1! ==
 
 Akaun anda telah dibuka. Jangan lupa untuk mengubah [[Special:Preferences|keutamaan {{SITENAME}}]] anda.',
@@ -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',
@@ -1475,7 +1481,7 @@ 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',
 'rightsnone' => '(tiada)',
@@ -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.",
@@ -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.',
@@ -2979,10 +2985,10 @@ 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',
 
 # Skin names
 'skinname-standard' => 'Klasik',
@@ -3562,6 +3568,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
@@ -3847,6 +3854,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..432c871 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,7 +663,7 @@ 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 />
@@ -1195,7 +1194,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 +1252,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',
@@ -2656,9 +2653,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 +2790,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 +3757,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..5aaf7e2 100644 (file)
@@ -567,8 +567,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',
index 65b112e..56298d6 100644 (file)
@@ -376,9 +376,9 @@ $1',
 'virus-unknownscanner' => 'အမည်မသိအန်တီဗိုင်းရပ်စ် -',
 
 # Login and logout pages
-'logouttext' => 'သင်သည် လော့ဂ်အောက် လုပ်လိုက်ပြီဖြစ်သည်။
-သင့်အနေနှင့် ဤ {{SITENAME}} ဝက်ဘ်ဆိုက်ဒ်ကို အမည်မသိ အသုံးပြုသူ အနေနှင့် ဆက်လက် အသုံးပြုနိုင်သည်။ သို့မဟုတ် ယခင် အသုံးပြုသူ အမည် သို့ အသုံးပြုသူ အခြားအမည်တစ်ခုဖြင့် [[Special:UserLogin|နောက်တစ်ကြိမ် လော့ဂ်အင်ပြန်ဝင်]] နိုင်သည်။
-သင်၏ ဘရောက်ဆာမှ cache ကို ရှင်းလင်းသည့် အချိန် အထိ အချို့သော စာမျက်နှာ များသည် သင် လော့ဂ်အင် ဝင်ထားစဉ်က အတိုင်းပင် ဆက်လက် ပြသနေမည်ဖြစ်သည်။',
+'logouttext' => "သင်သည် လော့ဂ်အောက် လုပ်လိုက်ပြီဖြစ်သည်။
+သင့်အနေနှင့် ဤ {{SITENAME}} ဝက်ဘ်ဆိုက်ဒ်ကို အမည်မသိ အသုံးပြုသူ အနေနှင့် ဆက်လက် အသုံးပြုနိုင်သည်။ သို့မဟုတ် ယခင် အသုံးပြုသူ အမည် သို့ အသုံးပြုသူ အခြားအမည်တစ်ခုဖြင့် <span class='plainlinks'>[$1 နောက်တစ်ကြိမ် လော့ဂ်အင်ပြန်ဝင်]</span> နိုင်သည်။
+သင်၏ ဘရောက်ဆာမှ cache ကို ရှင်းလင်းသည့် အချိန် အထိ အချို့သော စာမျက်နှာ များသည် သင် လော့ဂ်အင် ဝင်ထားစဉ်က အတိုင်းပင် ဆက်လက် ပြသနေမည်ဖြစ်သည်။",
 'welcomecreation' => '== မင်္ဂလာပါ $1! ==
 သင့်အကောင့်ကို ဖန်တီးပြီးပါပြီ။
 [[Special:Preferences|{{SITENAME}} စိတ်​ကြိုက်​ရွေးချယ်စရာတို့]]ကို ပြောင်းရန် မမေ့ပါနှင့်။',
@@ -691,8 +691,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' => 'အမည်ညွှန်းအားလုံးတွင် ရှာရန်',
index f908fdc..2223760 100644 (file)
@@ -857,8 +857,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'search-interwiki-caption' => 'Дугакс проектт',
 'search-interwiki-default' => '$1 савкс:',
 'search-interwiki-more' => '(седе ламо)',
-'search-mwsuggest-enabled' => 'ушодкс марто',
-'search-mwsuggest-disabled' => 'ушодкстомо',
 'search-relatedarticle' => 'Малавикс',
 'searcheverything-enable' => 'Вешнемс весе лем потмотнестэ',
 'searchrelated' => 'малавикс',
index 68482db..e0b58f5 100644 (file)
@@ -198,9 +198,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 +208,11 @@ $messages = array(
 'july' => 'جـولای',
 'august' => 'ئـوگـه‌سـت',
 'september' => 'سـه‌پـتـه‌مـبـر',
-'october' => 'ئÙ\80Ù\88Ú©Ù\80تÙ\80Ù\88بÙ\80ر',
+'october' => 'اکتبر',
 'november' => 'نـووه‌مـبـر',
 '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,7 +220,7 @@ $messages = array(
 'july-gen' => 'جـولای',
 'august-gen' => 'ئوگـه‌سـت',
 'september-gen' => 'سـه‌پـتـه‌مـبـر',
-'october-gen' => 'ئÙ\80Ù\88Ú©Ù\80تÙ\80Ù\88بÙ\80ر',
+'october-gen' => 'اکتبر',
 'november-gen' => 'نـووه‌مـبـر',
 'december-gen' => 'ده‌سـه‌مـبـر',
 'jan' => 'جانویه',
@@ -248,6 +248,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' => 'صفحه‌ئون نمایه نَیی',
@@ -384,7 +386,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 +398,7 @@ $2، $1',
 'viewsourcelink' => 'منبع بدی‌ین',
 'editsectionhint' => 'تیکه: $1 ره دچی‌ین',
 'toc' => 'دله',
-'showtoc' => 'نشون هاده',
+'showtoc' => 'سِراق هاده',
 'hidetoc' => 'فرو بور',
 'collapsible-collapse' => 'دوستن',
 'collapsible-expand' => 'گت هاکردن',
@@ -451,7 +457,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,15 +484,24 @@ $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' => '(دستور اس‌کیوال دپوشنی‌یه بیّه)',
 
@@ -489,6 +513,7 @@ $2، $1',
 'yourpassword' => 'شمه پسورد',
 'yourpasswordagain' => 'پسورد ره دِباره بنویس',
 'remembermypassword' => 'مه رمز ره (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) این مرورگر سر یاد نکان',
+'securelogin-stick-https' => 'HTTPS دله بموئن په، متصل بموند',
 'yourdomainname' => 'شمه کاروری نوم',
 'login' => 'دله بوردن',
 'nav-login-createaccount' => 'دله بوردن / عضو بیّن',
@@ -503,7 +528,8 @@ $2، $1',
 'createaccount' => 'ترنه حساب وا هکاردن',
 'gotaccount' => 'عضو هسنی؟ $1.',
 'gotaccountlink' => 'بورین دله',
-'createaccountmail' => 'ایمیل ِهمراه',
+'userlogin-resetlink' => 'دله بموئن ِجزئیات ره یاد هاکردی؟',
+'createaccountmail' => 'ایمیل جه',
 'createaccountreason' => 'دلیل:',
 'badretype' => 'دِتا پسوردی که بنویشتی اتجور نینه',
 'userexists' => 'کاروری نومی که بخاستنی وجود داشته.
@@ -523,6 +549,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 +574,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 +610,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 +683,6 @@ $2، $1',
 'search-suggest' => 'شما اینتا ره نخاسنی: $1',
 'search-interwiki-caption' => 'خاخر پروژه‌ئون',
 'search-interwiki-more' => '(ویشتر)',
-'search-mwsuggest-enabled' => 'پیشنهاد همرا',
-'search-mwsuggest-disabled' => 'هیچ پیشنهادی دنیه',
 'powersearch' => 'ململ بَیی دور هایتن',
 'powersearch-legend' => 'ململ بَیی دور هایتن',
 'powersearch-ns' => 'بچرخستن اینان دله:',
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..3ed3338 100644 (file)
@@ -1501,6 +1501,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..b4b07a7 100644 (file)
@@ -499,6 +499,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 +571,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 +598,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 +685,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 +731,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 +823,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 +865,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 +1037,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 +1106,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 532aab3..26d0596 100644 (file)
@@ -11,6 +11,7 @@
  * @author Boivie
  * @author Brik
  * @author Byrial
+ * @author Cocu
  * @author Danmichaelo
  * @author Dittaeva
  * @author Eirik
@@ -458,7 +459,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 +471,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',
@@ -721,7 +721,7 @@ 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.
@@ -1088,6 +1088,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 +1351,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',
@@ -1995,7 +2002,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',
@@ -2466,7 +2473,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 +2536,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.",
@@ -2830,6 +2838,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 +2963,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 +3090,7 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 
 # Info page
 'pageinfo-title' => 'Informasjon om «$1»',
+'pageinfo-not-current' => 'Informasjonen vises kanskje bare for den gjeldende revisjonen.',
 'pageinfo-header-basic' => 'Grunnleggende informasjon',
 'pageinfo-header-edits' => 'Redigeringshistorikk',
 'pageinfo-header-restrictions' => 'Sidebeskyttelse',
@@ -3106,10 +3115,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',
@@ -3684,6 +3700,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
@@ -3983,6 +4000,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.',
index 9fec623..289b68b 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,7 +605,7 @@ 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.
@@ -1102,8 +1101,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',
index 1e33586..7ed5534 100644 (file)
@@ -453,7 +453,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,7 +713,7 @@ 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.
@@ -1326,8 +1325,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',
@@ -2935,7 +2932,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 +3061,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 +3912,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..9d06fc6 100644 (file)
@@ -200,7 +200,6 @@ $messages = array(
 'qbbrowse' => 'ब्राउज गर्ने',
 'qbedit' => 'सम्पादन गर्ने',
 'qbpageoptions' => 'यो पेज',
-'qbpageinfo' => 'सन्दर्भ',
 'qbmyoptions' => 'मेरो पेज',
 'qbspecialpages' => 'विशेष पृष्ठहरु',
 'faq' => 'धैरै सोधिएका प्रश्नहरु',
@@ -457,7 +456,7 @@ $2',
 
 # Login and logout pages
 'logouttext' => "'''तपाईं अहिले बाहिर निस्कनु भएको छ।'''
-तपाईंले नाम/खाताविनै पनि {{SITENAME}}मा प्रयोग गर्न सक्नुहुन्छ, अथवा अघिकै वा अर्कै कुनै नामको खाताबाट [[Special:UserLogin|फेरि प्रवेश गर्न]] पनि सक्नुहुन्छ।
+तपाईंले नाम/खाताविनै पनि {{SITENAME}}मा प्रयोग गर्न सक्नुहुन्छ, अथवा अघिकै वा अर्कै कुनै नामको खाताबाट <span class='plainlinks'>[$1 फेरि प्रवेश गर्न]</span> पनि सक्नुहुन्छ।
 याद राख्नुहोस् तपाईंले ब्राउजरको स्मरण भण्डार खालि नगर्दासम्म कुनै पृष्ठहरूमा तपाईं अझै प्रवेश गरिराखेको देखाउन सक्छ।",
 'welcomecreation' => '== स्वागतम् , $1! ==
 तपाँईको खाता खोलिएको छ। [[Special:Preferences|{{SITENAME}} preferences]]मा आफ्ना अभिरुचिहरू परिवर्तन गर्न नबिर्सिनुहोला।',
@@ -1041,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' => 'सबै नेमस्पेसेजहरुमा खोज्नुहोस्',
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..5d3bf8d 100644 (file)
@@ -42,6 +42,7 @@
  * @author Trijnstel
  * @author Troefkaart
  * @author Tvdm
+ * @author Wiki13
  * @author לערי ריינהארט
  */
 
@@ -494,7 +495,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 +507,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',
@@ -734,7 +734,7 @@ Bewerken is 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,7 +763,7 @@ 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.
@@ -1153,6 +1153,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' => 'platte tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Waarschuwing:''' deze pagina gebruikt te veel kostbare parserfuncties.
@@ -1412,8 +1421,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',
@@ -2090,7 +2097,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',
@@ -2643,8 +2650,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.",
@@ -2953,6 +2960,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 +3091,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 +3231,7 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 
 # Info page
 'pageinfo-title' => 'Informatie over "$1"',
+'pageinfo-not-current' => 'Gegegevens worden mogelijk alleen weergegeven voor de huidige versie.',
 'pageinfo-header-basic' => 'Basisgegevens',
 'pageinfo-header-edits' => 'Bewerkingsgeschiedenis',
 'pageinfo-header-restrictions' => 'Paginabeveiliging',
@@ -3248,10 +3256,10 @@ 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',
 
 # Skin names
 'skinname-standard' => 'Klassiek',
@@ -3834,6 +3842,7 @@ De bevestigingscode vervalt op $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Interwiki-invoeging van sjablonen is uitgeschakeld]',
 'scarytranscludefailed' => '[Het sjabloon $1 kon niet opgehaald worden]',
+'scarytranscludefailed-httpstatus' => '[Het sjabloon $1 kon niet opgehaald worden: HTTP $2]',
 'scarytranscludetoolong' => '[De URL is te lang]',
 
 # Delete conflict
@@ -4128,6 +4137,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.',
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 7173974..110cc1f 100644 (file)
@@ -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
@@ -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',
@@ -710,7 +711,7 @@ 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.
@@ -1024,7 +1025,7 @@ Det siste loggelementet er oppgjeve under som referanse:",
 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 +1043,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 +1052,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.
@@ -1297,8 +1307,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',
@@ -1608,10 +1616,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-newpage' => 'Endringa oppretta ei ny side',
 'recentchanges-label-minor' => 'Dette er ei mindre endring',
 'recentchanges-label-bot' => 'Denne endringa vart gjort av ein bot',
-'recentchanges-label-unpatrolled' => 'Denne endringa er ikkje patruljert enno',
+'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 +1689,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.',
@@ -1784,11 +1792,13 @@ $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».',
@@ -1801,9 +1811,27 @@ $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».',
+
+# 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-wrong-format' => 'Den oppgjevne fila var ikkje ei ZIP-fil',
@@ -1811,6 +1839,7 @@ $1',
 Ho kan ikkje tryggingskontrollerast.',
 
 # Special:UploadStash
+'uploadstash-errclear' => 'Fjerning av filene var mislykka.',
 'uploadstash-refresh' => 'Oppdater fillista',
 
 # img_auth script messages
@@ -1904,7 +1933,7 @@ Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
 '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',
@@ -2086,7 +2115,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',
 
@@ -2233,21 +2262,22 @@ 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_reset' => 'Merk alle sidene som vitja',
 'enotif_newpagetext' => 'Dette er ei ny side.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-brukar',
 'changed' => 'endra',
@@ -2327,7 +2357,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 +2375,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 +2454,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.",
@@ -2784,6 +2816,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 +2848,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,7 +2862,6 @@ 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».',
@@ -2968,6 +3003,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 +3012,14 @@ 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-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',
@@ -3032,6 +3072,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 +3082,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',
@@ -3222,19 +3265,30 @@ 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-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-datetimeexpires' => 'Skal ikkje nyttast etter',
+'exif-datetimereleased' => 'Frigjeve',
 'exif-lens' => 'Objektiv',
+'exif-serialnumber' => 'Serienummeret på kameraet',
 'exif-cameraownername' => 'Eigar av kameraet',
 'exif-label' => 'Merkelapp',
+'exif-nickname' => 'Det uformelle namnet på biletet',
 'exif-rating' => 'Vurdering (av 5)',
 'exif-copyrighted' => 'Opphavsrettsstode',
 'exif-copyrightowner' => 'Opphavsrettseigar',
 'exif-usageterms' => 'Bruksvilkår',
+'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 +3463,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',
@@ -3500,6 +3555,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 +3586,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
@@ -3646,7 +3726,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',
@@ -3768,6 +3848,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.',
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..edc5210 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',
@@ -454,7 +456,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 +544,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 +585,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 +835,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 +859,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 +876,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',
@@ -931,7 +932,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 +956,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 +992,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..c72bb8b 100644 (file)
@@ -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,7 +678,7 @@ 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.
@@ -1222,8 +1221,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',
@@ -3449,4 +3446,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..d05c2a1 100644 (file)
@@ -322,13 +322,13 @@ $messages = array(
 'thursday' => 'ଗୁରୁବାର',
 'friday' => 'ଶୁକ୍ରବାର',
 'saturday' => 'ଶନିବାର',
-'sun' => 'ରବିବାର',
-'mon' => 'ସୋମବାର',
-'tue' => 'ମଙ୍ଗଳବାର',
-'wed' => 'ବୁଧବାର',
-'thu' => 'ଗୁରୁବାର',
-'fri' => 'ଶୁକ୍ରବାର',
-'sat' => 'ଶନିବାର',
+'sun' => 'ରବି',
+'mon' => 'ସୋମ',
+'tue' => 'ମଙ୍ଗଳ',
+'wed' => 'ବୁଧ',
+'thu' => 'ଗୁରୁ',
+'fri' => 'ଶୁକ୍ର',
+'sat' => 'ଶନି',
 'january' => 'ଜାନୁଆରୀ',
 'february' => 'ଫେବ୍ରୁଆରୀ',
 'march' => 'ମାର୍ଚ୍ଚ',
@@ -401,7 +401,6 @@ $messages = array(
 'qbbrowse' => 'ଖୋଜିବା',
 'qbedit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
 'qbpageoptions' => 'ଏହି ପୃଷ୍ଠାଟି',
-'qbpageinfo' => 'ଭିତର ଚିଜ',
 'qbmyoptions' => 'ମୋ ପୃଷ୍ଠାଗୁଡ଼ିକ',
 'qbspecialpages' => 'ବିଶେଷ ପୃଷ୍ଠା',
 'faq' => 'ବାରମ୍ବାର ପଚରାଯାଉଥିବା ପ୍ରଶ୍ନ',
@@ -664,7 +663,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ଆପଣ ଲଗାଆଉଟ କରିଦେଲେ'''
 
-ଆପଣ ଅଜଣା ଭାବରେ {{SITENAME}}କୁ ଯାଇପାରିବେ, କିମ୍ବା [[Special:UserLogin|ଆଉଥରେ]] ଆଗର ଇଉଜର ନାଆଁରେ/ଅଲଗା ନାଆଁରେ ଲଗଇନ କରିପାରିବେ ।
+ଆପଣ ଅଜଣା ଭାବରେ {{SITENAME}}କୁ ଯାଇପାରିବେ, କିମ୍ବା <span class='plainlinks'>[$1 ଆଉଥରେ]</span> ଆଗର ଇଉଜର ନାଆଁରେ/ଅଲଗା ନାଆଁରେ ଲଗଇନ କରିପାରିବେ ।
 ଜାଣିରଖନ୍ତୁ, କିଛି ପୃଷ୍ଠା ଲଗାଆଉଟ କଲାପରେ ବି ଆଗପରି ଦେଖାଯାଇପାରେ, ଆପଣ ବ୍ରାଉଜର କାସକୁ ହଟାଇଲା ଯାଏଁ ଏହା ଏମିତି ରହିବ ।",
 'welcomecreation' => '== $1!, ଆପଣଙ୍କ ଖାତାଟି ତିଆରି ହୋଇଗଲା==
 ତେବେ, ନିଜର [[Special:Preferences|{{SITENAME}} ପସନ୍ଦସବୁକୁ]] ବଦଳାଇବାକୁ ଭୁଲିବେ ନାହିଁ ।',
@@ -930,10 +929,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 +1048,9 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 ଏହା ଅଗରୁ ଅଛି ।',
 'defaultmessagetext' => 'ଡିଫଲ୍ଟ ମେସେଜ ଲେଖାଗୁଡିକ',
 
+# Content models
+'content-model-wikitext' => 'ଉଇକିଟେକ୍ସଟ',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ଚେତାବନୀ:''' ଏହି ପୃଷ୍ଠାରେ ଅନେକ ଗୁଡ଼ିଏ ମୂଲ୍ୟବାନ ପାର୍ସର ଫଙ୍କସନ କଲ ଅଛି ।
 
@@ -1300,8 +1302,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' => 'ସବୁଗୁଡ଼ିକ ନେମସ୍ପେସରେ ଖୋଜିବେ',
@@ -2913,9 +2913,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,11 +3009,12 @@ 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' => 'ନିଆରା ଲେଖକଙ୍କ ସଂଖ୍ୟା',
 
 # Patrolling
@@ -3061,6 +3059,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 +3854,10 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'feedback-bugcheck' => 'ବହୁତ ଭଲ ! ଖାଲି ଦେଖିଦିଅନ୍ତୁ ଯେ ଏହା ଆଗରୁ ଥିବା [$1 known bugs] ମଧ୍ୟରୁ ନୁହେଁ ତ ।',
 'feedback-bugnew' => 'ମୁଁ ଯାଞ୍ଚ କରିଦେଲି । ନୂତନ ଅସୁବିଧାର ବିବରଣ କରନ୍ତୁ ।',
 
+# Search suggestions
+'searchsuggest-search' => 'ଖୋଜିବା',
+'searchsuggest-containing' => 'ଧାରଣ ହେଉଛି...',
+
 # API errors
 'api-error-badaccess-groups' => 'ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଅପଲୋଡ଼ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ ।',
 'api-error-badtoken' => 'ଭିତର ଅସୁବିଧା: ଖରାପ ଟୋକନ ।',
index 02427e0..e90518b 100644 (file)
@@ -234,7 +234,6 @@ $messages = array(
 'qbbrowse' => 'Фен',
 'qbedit' => 'Ивын',
 'qbpageoptions' => 'Ацы фарс',
-'qbpageinfo' => 'Фарсы контекст',
 'qbmyoptions' => 'Мæ фæрстæ',
 'qbspecialpages' => 'Сæрмагонд фæрстæ',
 'faq' => 'FAQ',
@@ -247,7 +246,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' => 'Истори',
@@ -299,7 +298,7 @@ $messages = array(
 'projectpage' => 'Проекты фарс фен',
 'imagepage' => 'Файлы фарс фен',
 'mediawikipage' => 'Фыстæджы фарс фен',
-'templatepage' => 'ШаблонÑ\8b Ñ\84аÑ\80Ñ\81 Ñ\84ен',
+'templatepage' => 'Ð¥Ñ\83Ñ\8bзæджÑ\8b Ñ\84аÑ\80Ñ\81 Ñ\84енÑ\8bн',
 'viewhelppage' => 'Æххуысы фарс фен',
 'categorypage' => 'Категорийы фарс фен',
 'viewtalkpage' => 'Тæрхон фен',
@@ -393,7 +392,7 @@ $1',
 'nstab-project' => 'Проекты тыххæй',
 'nstab-image' => 'Файл',
 'nstab-mediawiki' => 'Фыстæг',
-'nstab-template' => 'Шаблон',
+'nstab-template' => 'Ð¥Ñ\83Ñ\8bзæг',
 'nstab-help' => 'Æххуысы фарс',
 'nstab-category' => 'Категори',
 
@@ -502,7 +501,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Ныр дæ æддæмæ хызт.'''
 
-Дæ бон у дарддæр архайай {{grammar:genitive|{{SITENAME}}}} æнæномæй, æви та [[Special:UserLogin|фæстæмæ бахизын]] раздæры номæй кæнæ та æндæр номæй.
+Дæ бон у дарддæр архайай {{grammar:genitive|{{SITENAME}}}} æнæномæй, æви та <span class='plainlinks'>[$1 фæстæмæ бахизын]</span> раздæры номæй кæнæ та æндæр номæй.
 Дæ сæры дар æмæ иуæй иу фæрстæ гæнæн ис æвдыст цæуой афтæ, цымæ нырмæ дæр нæ рахызтæ. Уый тыххæй дæ браузеры кеш сафтид кæн.",
 'welcomecreation' => '== Ӕгас цу, $1! ==
 Дæ аккаунт арæзт æрцыдис.
@@ -770,7 +769,7 @@ $2
 '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 +785,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' => 'Ацы фарсæн йæ логтæ равдисын',
@@ -878,8 +877,6 @@ $2
 'search-suggest' => 'Кæд мыййаг агурыс: $1',
 'search-interwiki-caption' => 'Æфсымæрон проекттæ',
 'search-interwiki-more' => '(нодзы)',
-'search-mwsuggest-enabled' => 'æмбарынгæнæнтимæ',
-'search-mwsuggest-disabled' => 'æнæ æмбарынгæнæнтæ',
 'searchrelated' => 'хæстæг',
 'searchall' => 'иууылдæр',
 'showingresultsheader' => "{{PLURAL:$5|Фæстиуæг '''$1''' '''$3'''-йæ|Фæстиуджытæ '''$1 - $2''' '''$3'''-йæ}} '''{{grammar:dative|$4}}'''",
@@ -1108,7 +1105,7 @@ $3',
 'download' => 'æрбавгæн',
 
 # Unused templates
-'unusedtemplates' => 'Ð\9fайда ÐºÃ¦Ð¼Ã¦Ð¹ Ð½Ã¦ Ñ\87Ñ\8bндæÑ\83Ñ\8b, Ð°Ñ\85æм Ñ\88аблонтæ',
+'unusedtemplates' => 'Ð\9fайда ÐºÃ¦Ð¼Ã¦Ð¹ Ð½Ã¦ Ñ\87Ñ\8bндæÑ\83Ñ\8b, Ð°Ñ\85æм Ñ\85Ñ\83Ñ\8bзæгтæ',
 
 # Random page
 'randompage' => 'Халæй ист фарс',
@@ -1136,7 +1133,7 @@ $3',
 'lonelypages' => 'Сидзæр фæрстæ',
 'uncategorizedpages' => 'Æнæкатегори фæрстæ',
 'uncategorizedimages' => 'Æнæкатегори файлтæ',
-'uncategorizedtemplates' => 'Ã\86нæкаÑ\82егоÑ\80и Ñ\88аблонтæ',
+'uncategorizedtemplates' => 'Ã\86нæкаÑ\82егоÑ\80и Ñ\85Ñ\83Ñ\8bзæгтæ',
 'popularpages' => 'Популярон фæрстæ',
 'wantedcategories' => 'Хъæугæ категоритæ',
 'wantedpages' => 'Хъæугæ фæрстæ',
@@ -1410,7 +1407,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' => 'Бавæр дæ ивдтытæ',
index 6e0857c..c5bd9e6 100644 (file)
@@ -932,8 +932,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' => 'ਸਾਰੇ ਥਾਂ-ਨਾਂਵਾਂ ਵਿਚ ਖੋਜੋ',
@@ -2073,4 +2071,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..b003cb7 100644 (file)
@@ -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)',
@@ -773,8 +772,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',
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..7d5451b 100644 (file)
@@ -28,15 +28,15 @@ $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',
@@ -139,7 +139,6 @@ $messages = array(
 'qbbrowse' => 'Trifouille',
 'qbedit' => 'Editer',
 'qbpageoptions' => 'Chol pache-lo',
-'qbpageinfo' => 'Conteske',
 'qbmyoptions' => 'Mes paches',
 'qbspecialpages' => 'Espéciales paches',
 'faq' => 'FAQ',
@@ -152,7 +151,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",
@@ -410,10 +409,15 @@ Os prométtez auchi éq vos avez écrit ch'teske vous-méme, ou éq vos l’avez
 '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}}:",
 
+# 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",
+
 # 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',
@@ -430,6 +434,8 @@ Léginde : ({{MediaWiki:Cur}}) = différinches aveuc el vérchon à ch'momint-ch
 # 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
@@ -454,6 +460,17 @@ Léginde : ({{MediaWiki:Cur}}) = différinches aveuc el vérchon à ch'momint-ch
 'nextn' => 'apreu {{PLURAL:$1|$1}}',
 'prevn-title' => 'Dvant $1 {{PLURAL:$1|résultat|résultats}}',
 'viewprevnext' => 'Vir ($1 {{int:pipe-separator}} $2) ($3)',
+'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-redirect' => '(érdirection $1)',
 'search-section' => '(sekchon $1)',
@@ -461,9 +478,9 @@ Léginde : ({{MediaWiki:Cur}}) = différinches aveuc el vérchon à ch'momint-ch
 '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",
+'searchall' => 'tout',
 '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:',
@@ -505,6 +522,28 @@ 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}}',
@@ -542,8 +581,10 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
 'uploadedimage' => '"[[$1]]" quértchée',
 
 # 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,9 +592,11 @@ 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 :",
 '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',
 
 # Random page
@@ -566,6 +609,7 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
 'nbytes' => '$1 {{PLURAL:$1|octé|octés}}',
 'nmembers' => '$1 {{PLURAL:$1|mimbe|mimbes}}',
 'prefixindex' => 'Tertous chés paches aveuc préfix',
+'usercreated' => '{{GENDER:$3|Créé}} ech $1 à $2',
 'newpages' => 'Novèles paches',
 'move' => 'Déplacher',
 'movethispage' => "Déplacher l'pache-lo",
@@ -610,6 +654,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',
@@ -669,6 +714,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:',
@@ -686,6 +732,8 @@ 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-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",
@@ -758,6 +806,9 @@ 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',
+
 # Thumbnails
 'thumbnail-more' => 'Pu grand',
 
@@ -819,6 +870,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',
index 9806086..7943edb 100644 (file)
@@ -412,8 +412,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:',
@@ -1020,4 +1018,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..8fd0351 100644 (file)
@@ -25,6 +25,13 @@ $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',
 'january' => 'Jänner',
 'february' => 'Fewwer',
 'march' => 'März',
@@ -84,8 +91,12 @@ $messages = array(
 'qbmyoptions' => 'Mai Saide',
 
 # Vector skin
+'vector-action-delete' => 'Lesche',
 'vector-action-move' => 'Verschiewe',
+'vector-action-protect' => 'Schitze',
 'vector-view-edit' => 'Bearwaide',
+'vector-view-view' => 'Lese',
+'actions' => 'Agzione',
 
 'errorpagetitle' => 'Fehler',
 'returnto' => 'Zrick zu $1.',
@@ -253,7 +264,7 @@ du gebbscht do au zu, dass Du des selwerscht gschriwwe hoscht orrer vun ere effe
 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',
@@ -305,8 +316,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',
@@ -361,8 +370,8 @@ 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',
@@ -398,6 +407,7 @@ 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-thumb' => 'Vorschaubild',
@@ -405,7 +415,7 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 '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 +443,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',
@@ -563,7 +573,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 +587,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',
@@ -665,18 +675,18 @@ Du kannscht awwer de Quelltext aagucke',
 '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-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-whatlinkshere' => 'Lischt vun alle Wikisaide, wu do her verlinkt sinn',
 'tooltip-t-recentchangeslinked' => 'Letschte Ä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-emailuser' => 'Dem Benutzer e E-Mail schicke',
-'tooltip-t-upload' => 'Dateie nuflade',
+'tooltip-t-upload' => 'Dateije nufflade',
 'tooltip-t-specialpages' => 'Lischt vun alle Spezialsaide',
 'tooltip-t-print' => 'Druckversion vun derre Said',
 'tooltip-t-permalink' => 'E dauerhafte Link zu derre Version vun de Said',
@@ -693,7 +703,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',
 
@@ -724,8 +734,8 @@ Annere Links in der glaiche Zail werre als Ausnahme behannelt, d. h. Saide, wu d
 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-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 +775,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..31ea8bf 100644 (file)
@@ -438,7 +438,6 @@ $messages = array(
 'qbbrowse' => 'Przeglądanie',
 'qbedit' => 'Edycja',
 'qbpageoptions' => 'Ta strona',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Moje strony',
 'qbspecialpages' => 'strony specjalne',
 'faq' => 'FAQ',
@@ -451,7 +450,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ę',
@@ -701,7 +700,7 @@ 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.
@@ -1327,8 +1326,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',
@@ -1671,9 +1668,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).
@@ -2966,7 +2963,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”.',
@@ -3123,7 +3119,6 @@ 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)',
@@ -4039,6 +4034,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 6ef483e..3f04482 100644 (file)
@@ -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',
@@ -419,8 +418,10 @@ Arcesta: $2',
 'protectedpagetext' => "Sta pàgina-sì a l'è stàita blocà për evité che a-j faso dle modìfiche.",
 '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,10 +444,10 @@ 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.",
+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.",
 'welcomecreation' => '==Bin ëvnù, $1!==
 Sò cont a l\'é stàit creà.
 Che as dësmentia pa ëd cambié ij [[Special:Preferences|"sò gust" an {{SITENAME}}]].',
@@ -694,9 +695,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}}}}].",
@@ -804,6 +805,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 +1069,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',
@@ -1157,7 +1165,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',
@@ -1589,7 +1597,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».',
@@ -2266,7 +2274,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.",
@@ -2570,6 +2579,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 +2710,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».',
@@ -2839,10 +2848,10 @@ 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',
 
 # Patrolling
 'markaspatrolleddiff' => 'Marché coma verificà',
@@ -3011,20 +3020,20 @@ J'àutri a saran stërmà coma stàndard.
 '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 +3048,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 +3060,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 +3071,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 +3088,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 +3104,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 +3112,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 +3129,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 +3144,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,14 +3167,14 @@ 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)',
@@ -3424,6 +3433,7 @@ Cost còdes ëd conferma a scad ai \$4.",
 # 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é]",
+'scarytranscludefailed-httpstatus' => '[Letura dlë stamp falìa për $1: HTTP $2]',
 'scarytranscludetoolong' => "[L'URL a l'é tròp longa]",
 
 # Delete conflict
@@ -3714,6 +3724,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.',
index 57d9886..2efddb7 100644 (file)
@@ -166,7 +166,6 @@ $messages = array(
 'qbbrowse' => 'لبو',
 'qbedit' => 'لکھو',
 'qbpageoptions' => 'اے صفہ',
-'qbpageinfo' => 'محول',
 'qbmyoptions' => 'میرے صفے',
 'qbspecialpages' => 'خاص صفے',
 'faq' => 'FAQ',
@@ -411,8 +410,8 @@ $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! ==
 تواڈا کھاتا بن گیا اے۔
@@ -1002,8 +1001,6 @@ $1",
 'search-interwiki-caption' => 'رلدے ویونت',
 'search-interwiki-default' => '$1 نتارے:',
 'search-interwiki-more' => '(اور)',
-'search-mwsuggest-enabled' => 'صلاع دے نال',
-'search-mwsuggest-disabled' => 'کوئی صلاع نئیں',
 'search-relatedarticle' => 'جڑیاں',
 'mwsuggest-disable' => 'اجاکس مشورے نکارہ کرو',
 'searcheverything-enable' => 'ہر ناں چ لبو',
@@ -2616,7 +2613,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript ٹیسٹنگ',
-'javascripttest-disabled' => 'ایس وکی تے ایہ کم نئیں چلدا۔',
 'javascripttest-title' => 'ٹیسٹ  $1 چلدا اے۔',
 'javascripttest-pagetext-noframework' => 'ایہ صفہ JavaScript  ٹیسٹاں لئی بچایا گیا اے۔',
 'javascripttest-pagetext-unknownframework' => '"$1" انجانا ٹیسٹنگ فریمورک۔',
@@ -3561,6 +3557,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..d7331b9 100644 (file)
@@ -607,8 +607,6 @@ $messages = array(
 'search-interwiki-caption' => 'Αδερφικά έργα',
 'search-interwiki-default' => '$1 αποτελέσματα:',
 'search-interwiki-more' => '(πλέα)',
-'search-mwsuggest-enabled' => 'με οδηγίας',
-'search-mwsuggest-disabled' => 'θίχως οδηγίας',
 'searchall' => 'ούλαι',
 'nonefound' => "'''Σημείωση:''' Κανονικά ολίγα περιοχάς ονοματίων αραεύκουνταν μαναχόν. Βαλέστεν ''all:'' ασην λέξην εμπροστά για ίνεται το αράεμαν σ'όλεα τα σελίδας (και σελίδας καλατσεματί, πρότυπα κλπ.) ή βαλέστεν ους πρόθεμαν την περιοχήν ονοματίων π'θέλετε για να αραεύετε εκαικά.",
 'powersearch' => 'Αναλυτικόν αράεμαν',
@@ -1445,4 +1443,7 @@ $messages = array(
 'htmlform-reset' => "Κλώσον τ'αλλαγάς",
 'htmlform-selectorother-other' => 'Άλλον',
 
+# Search suggestions
+'searchsuggest-search' => 'Αράεμαν',
+
 );
index 840efbc..f0d44b3 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,7 +375,7 @@ 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.
@@ -824,8 +823,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',
index 57aa108..d7cf926 100644 (file)
@@ -531,7 +531,7 @@ $1',
 # Login and logout pages
 'logouttext' => "'''تاسې اوس د غونډال نه ووتلی.'''
 
-تاسې کولای شی چې د کارن-نوم نه پرته په ورکنومي توګه {{SITENAME}} وکاروی، او يا هم په همدې او يا کوم بل کارن-نوم، يو ځل [[Special:UserLogin|بيا غونډال ته ورننوځۍ]].
+تاسې کولای شی چې د کارن-نوم نه پرته په ورکنومي توګه {{SITENAME}} وکاروی، او يا هم په همدې او يا کوم بل کارن-نوم، يو ځل <span class='plainlinks'>[$1 بيا غونډال ته ورننوځۍ]</span>.
 دا په پام کې وساتۍ چې تر څو تاسې د خپل کتنمل حافظه نه وي سپينه کړې، نو ځينې مخونو کې به لا تر اوسه پورې په غونډال کې ننوتي ښکارۍ.",
 'welcomecreation' => '==$1 ښه راغلۍ! ==
 
@@ -960,8 +960,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' => 'په ټولو نوم-تشيالونو کې پلټل',
@@ -2645,6 +2643,9 @@ $5
 'feedback-cancel' => 'ناګارل',
 'feedback-close' => 'ترسره شو',
 
+# Search suggestions
+'searchsuggest-search' => 'پلټل',
+
 # API errors
 'api-error-duplicate-popup-title' => 'غبرګونې {{PLURAL:$1|دوتنه|دوتنې}}.',
 'api-error-empty-file' => 'کومه دوتنه چې تاسې دلته سپارلې هغه تشه ده.',
index d00a6e9..5edec5e 100644 (file)
@@ -454,7 +454,6 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta página',
-'qbpageinfo' => 'Contexto',
 'qbmyoptions' => 'Minhas páginas',
 'qbspecialpages' => 'Páginas especiais',
 'faq' => 'FAQ',
@@ -717,7 +716,7 @@ 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.
@@ -1352,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',
@@ -2993,7 +2990,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.',
@@ -3149,7 +3145,6 @@ 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)',
 
@@ -4009,6 +4004,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..8f7cf36 100644 (file)
@@ -458,7 +458,6 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta página',
-'qbpageinfo' => 'Contexto',
 'qbmyoptions' => 'Minhas páginas',
 'qbspecialpages' => 'Páginas especiais',
 'faq' => 'FAQ',
@@ -721,7 +720,7 @@ 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.
@@ -971,7 +970,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.
@@ -1336,8 +1335,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',
@@ -2964,7 +2961,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 +3106,6 @@ 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}})',
 
 # Skin names
 'skinname-standard' => 'Clássico',
@@ -3964,6 +3959,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..6684e66 100644 (file)
@@ -555,9 +555,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,7 +726,8 @@ 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',
+'logouttext' => 'Log out message
+* $1 is an URL to [[Special:Userlogin]] containing returnto and returntoquery parameters',
 'welcomecreation' => 'The welcome message users see after registering a user account. $1 is the username of the new user.',
 'yourname' => "In user preferences
 
@@ -1034,7 +1035,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 +1062,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.
@@ -1860,7 +1893,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]].
@@ -2104,7 +2137,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.',
@@ -2807,7 +2840,12 @@ 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-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 +2893,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 +2938,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 +2961,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.
 
@@ -3191,6 +3244,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 +3346,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 +3528,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.',
@@ -3499,14 +3558,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}}
@@ -4349,6 +4418,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
@@ -4838,6 +4913,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.',
index 7c34cfb..afb3cc7 100644 (file)
@@ -411,7 +411,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',
@@ -660,7 +659,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.",
+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.",
 'welcomecreation' => '== Allinmi hamusqayki $1! ==
 Rakiqunaykiqa kicharisqañam.
 Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] kikinchayta.',
@@ -1241,8 +1240,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",
@@ -2797,7 +2794,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',
@@ -3751,6 +3747,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..ae3564f 100644 (file)
@@ -500,8 +500,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..16f54fa 100644 (file)
@@ -364,8 +364,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..e295cd6 100644 (file)
@@ -437,7 +437,7 @@ 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.",
+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.",
 'welcomecreation' => '==Bainvegni, $1! ==
 Tes conto è vegni creà.
 Betg emblida da midar tias [[Special:Preferences|preferenzas da {{SITENAME}}]].',
@@ -987,8 +987,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',
@@ -2398,7 +2396,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".',
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..17d12f7 100644 (file)
@@ -446,7 +446,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 +458,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',
@@ -712,7 +711,7 @@ 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!==
 
@@ -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.
@@ -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ă.',
@@ -1979,7 +1985,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 +2150,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}}',
@@ -2531,7 +2537,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.",
@@ -2843,6 +2850,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 +2867,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 +2919,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 +2977,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 +3094,7 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 
 # Info page
 'pageinfo-title' => 'Informații pentru „$1”',
+'pageinfo-not-current' => 'Informațiile se pot afișa doar pentru versiunea curentă.',
 'pageinfo-header-basic' => 'Informații de bază',
 'pageinfo-header-edits' => 'Istoric modificări',
 'pageinfo-header-restrictions' => 'Protecție pagină',
@@ -3111,10 +3119,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',
@@ -3694,6 +3709,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
@@ -3964,6 +3980,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.',
index cfbc010..d9ed9c9 100644 (file)
@@ -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,7 +445,7 @@ 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.
@@ -1089,8 +1088,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",
@@ -2765,7 +2762,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,7 +2928,6 @@ 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)',
@@ -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..822b591 100644 (file)
@@ -28,6 +28,7 @@
  * @author Dim Grits
  * @author Don Alessandro
  * @author Eleferen
+ * @author Erdemaslancan
  * @author EugeneZelenko
  * @author Eugrus
  * @author Express2000
@@ -40,6 +41,7 @@
  * @author HalanTul
  * @author Huuchin
  * @author Illusion
+ * @author Incnis Mrsi
  * @author Iniquity
  * @author Innv
  * @author Jackie
@@ -61,6 +63,7 @@
  * @author Sagan
  * @author Shirayuki
  * @author Sk
+ * @author Spider
  * @author TarzanASG
  * @author Temuri rajavi
  * @author Vago
@@ -539,7 +542,6 @@ $messages = array(
 'qbbrowse' => 'Просмотреть',
 'qbedit' => 'Править',
 'qbpageoptions' => 'Настройки страницы',
-'qbpageinfo' => 'Сведения о странице',
 'qbmyoptions' => 'Ваши настройки',
 'qbspecialpages' => 'Специальные страницы',
 'faq' => 'ЧаВО',
@@ -552,7 +554,7 @@ $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' => 'История',
@@ -803,7 +805,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Вы завершили сеанс работы.'''
 
-Вы можете продолжить участие в {{grammar:genitive|{{SITENAME}}}} анонимно или [[Special:UserLogin|представиться заново]] под тем же или другим именем.
+Вы можете продолжить участие в {{grammar:genitive|{{SITENAME}}}} анонимно или <span class='plainlinks'>[$1 представиться заново]</span> под тем же или другим именем.
 Некоторые страницы могут продолжать отображаться в том виде, как будто вы всё ещё представлены системе. Для борьбы с этим явлением обновите кеш браузера.",
 'welcomecreation' => '== Добро пожаловать, $1! ==
 Ваша учётная запись создана.
@@ -972,7 +974,7 @@ $2
 'changeemail-oldemail' => 'Текущий адрес электронной почты:',
 'changeemail-newemail' => 'Новый адрес электронной почты:',
 'changeemail-none' => '(нет)',
-'changeemail-submit' => 'Ð\98зменениÑ\82Ñ\8c Ð°Ð´Ñ\80еÑ\81',
+'changeemail-submit' => 'Изменить адрес',
 'changeemail-cancel' => 'Отмена',
 
 # Edit page toolbar
@@ -1180,6 +1182,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' => 'Внимание. Эта страница содержит слишком много вызовов ресурсоёмких функций.
@@ -1434,8 +1445,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' => 'Поиск по всем пространствам имён',
@@ -2090,7 +2099,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',
@@ -2634,7 +2643,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|журнал удалений]].",
@@ -2938,6 +2948,7 @@ $1',
 'immobile-target-namespace-iw' => 'Ссылка интервики не может быть использована для переименования.',
 'immobile-source-page' => 'Эту страницу нельзя переименовать.',
 'immobile-target-page' => 'Нельзя присвоить странице это имя.',
+'bad-target-model' => 'Невозможно преобразовать $1 в $2: несовместимые модели данных.',
 'imagenocrossnamespace' => 'Невозможно дать файлу имя из другого пространства имён',
 'nonfile-cannot-move-to-file' => 'Невозможно переименовывать страницы в файлы',
 'imagetypemismatch' => 'Новое расширение файла не соответствует его типу',
@@ -3062,7 +3073,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Проверка JavaScript',
-'javascripttest-disabled' => 'Эта функция отключена в этой вики.',
 'javascripttest-title' => 'Проводится проверка $1',
 'javascripttest-pagetext-noframework' => 'Эта страница зарезервирована для запуска JavaScript-тестов.',
 'javascripttest-pagetext-unknownframework' => 'Неизвестная среда тестирования «$1».',
@@ -3203,6 +3213,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' => 'Защита страницы',
@@ -3217,6 +3228,7 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-views' => 'Количество просмотров',
 'pageinfo-watchers' => 'Число наблюдающих',
 'pageinfo-redirects-name' => 'Перенаправления на эту страницу',
+'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'Подстраницы данной страницы',
 'pageinfo-subpages-value' => '$1($2 {{PLURAL:$2|перенаправление|перенаправления|перенаправлений}}; $3 {{PLURAL:$3|обычная|обычные|обычных}})',
 'pageinfo-firstuser' => 'Создатель страницы',
@@ -3227,10 +3239,10 @@ 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' => 'Сведения о странице',
 
 # Skin names
 'skinname-standard' => 'Классическое',
@@ -3825,6 +3837,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[Интервики-включение отключено]',
 'scarytranscludefailed' => '[Ошибка обращения к шаблону $1]',
+'scarytranscludefailed-httpstatus' => '[Не удалось загрузить шаблон для $1: HTTP $2]',
 'scarytranscludetoolong' => '[Слишком длинный URL]',
 
 # Delete conflict
@@ -4126,7 +4139,7 @@ MediaWiki распространяется в надежде, что она бу
 'sqlite-no-fts' => '$1 без поддержки полнотекстового поиска',
 
 # New logging system
-'logentry-delete-delete' => '$1 удалил страницу $3',
+'logentry-delete-delete' => '$1 {{GENDER:$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',
@@ -4173,6 +4186,10 @@ MediaWiki распространяется в надежде, что она бу
 'feedback-bugcheck' => 'Прекрасно! Только проверьте, что в списке [$1 известных ошибок] её нет подобной записи.',
 'feedback-bugnew' => 'Я проверил. Сообщить о новой ошибке',
 
+# Search suggestions
+'searchsuggest-search' => 'Поиск',
+'searchsuggest-containing' => 'содержащие…',
+
 # API errors
 'api-error-badaccess-groups' => 'Вам не разрешено загружать файлы в эту вики.',
 'api-error-badtoken' => 'Внутренняя ошибка:  некорректный токен.',
index b952907..0865153 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' => 'Придавати переменованы сторінкы і файлы до мого списку слїдованых',
@@ -178,7 +178,7 @@ $messages = array(
 # Dates
 'sunday' => 'недїля',
 'monday' => 'понедїлёк',
-'tuesday' => 'віторок',
+'tuesday' => 'вівторок',
 'wednesday' => 'середа',
 'thursday' => 'четверь',
 'friday' => 'пятніця',
@@ -262,7 +262,6 @@ $messages = array(
 'qbbrowse' => 'Переглядати',
 'qbedit' => 'Едітовати',
 'qbpageoptions' => 'Тота сторінка',
-'qbpageinfo' => 'Контекст',
 'qbmyoptions' => 'Мої сторінкы',
 'qbspecialpages' => 'Шпеціалны сторінкы',
 'faq' => 'Часты звідованя',
@@ -341,7 +340,7 @@ $messages = array(
 'jumptonavigation' => 'навіґація',
 'jumptosearch' => 'Найти',
 'view-pool-error' => 'Перебачте, серверы суть теперь переладованы.
-Тоту сторінку сі теперь пoзерать много хоснователїв.
+Тоту сторінку собі теперь пoзерать много хоснователїв.
 Просиме Вас, почекайте і спробуйте доступность пізнїше.
 
 $1',
@@ -370,7 +369,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 +384,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' => 'видїти код',
@@ -495,7 +494,8 @@ $1',
 'protectedpagetext' => 'Тота сторінка была замкнута, также ся не дасть едітовати',
 'viewsourcetext' => 'Можете видїти і копіровати код той сторінкы:',
 'viewyourtext' => "Можете собі посмотрити і скопіровати жрідловый текст '''вашых змін''' той сторінкы:",
-'protectedinterface' => 'Тота сторінка є частёв інтрефейсу проґрамового забеспечіня і єй можуть едітовати лем адміністраторы проєкту.',
+'protectedinterface' => 'Тота сторінка є частёв інтрефейсу проґрамового забеспечіня той вікі і єй можуть едітовати лем адміністраторы проєкту.
+Жебы придати або змінити переклады, просиме хоснуйте [//translatewiki.net/ translatewiki.net], локалізачный проєкт MediaWiki.',
 'editinginterface' => "'''Увага:''' Едітуєте сторінку,котра є частинов текстового інтерфейсу. Зміны той сторінкы выкличуть зміну інтерфейсу про іншых хоснователїв. Про переклад увідомлїня хоснуйте [//translatewiki.net/wiki/Main_Page?setlang=uk translatewiki.net] — проєкт, што ся занимає локалізаціёв MediaWiki.",
 'sqlhidden' => '(SQL запрос скрытый)',
 'cascadeprotected' => 'Сторінка є замнкута, бо є вложена до  {{PLURAL:$1|наслїдуючой сторінкы замкнуты|наслїдуючіх сторінок замнкнутых|наслїдуючіх сторінок замнкнутых}} каскадовым замком:
@@ -521,14 +521,14 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Нынї сьте одголошеный(а).'''
 
-Можете продовжовати в анонімнім перезераню і едітації {{grammar:2sg|{{SITENAME}}}}, або ся можете [[Special:UserLogin|зясь приголосити]] як тот самый або як іншый хоснователь. Даякы сторінкы ся можуть зображовати як кібы сьте были дотеперь приголошены, покы не змажете кеш переглядача.",
+Можете продовжовати в анонімнім перезераню і едітації {{grammar:2sg|{{SITENAME}}}}, або ся можете <span class='plainlinks'>[$1 зясь приголосити]</span> як тот самый або як іншый хоснователь. Даякы сторінкы ся можуть зображовати як кібы сьте были дотеперь приголошены, покы не змажете кеш переглядача.",
 'welcomecreation' => '== Вітаєме вас, $1! ==
 Ваше конто было вытворене.
 Не забудьте змінити свої [[Special:Preferences|наставлїня сайту]].',
 'yourname' => 'Імя хоснователя:',
 'yourpassword' => 'Гесло:',
 'yourpasswordagain' => 'Повторяйте гесло:',
-'remembermypassword' => 'Запамятати моє приголошіня на тім компютерї (максімално $1 {{PLURAL:$1|день|днів}})',
+'remembermypassword' => 'Запамнятати моє приголошіня на тім компютерї (максімално $1 {{PLURAL:$1|день|днів}})',
 'securelogin-stick-https' => 'Останьте  припоєны через HTTPS по приголошіню',
 'yourdomainname' => 'Ваша домена:',
 'password-change-forbidden' => 'На тій вікі не можете мінити гесла.',
@@ -1029,7 +1029,7 @@ $1",
 'revdelete-only-restricted' => 'Хыба схованя положкы з $2 $1: Не можете положкы сховати лем перед адміністраторами жебы сьте сучасно выбрали і дакотру з далшых можностей затаїня.',
 'revdelete-reason-dropdown' => '*Звыклы причіны змазаня
 ** Порушіня авторьскых прав
-** Невгодны особны дата
+** Ð\9dевгоднÑ\8b ÐºÐ¾Ð¼ÐµÐ½Ñ\82аÑ\80Ñ\97 Ð°Ð±Ð¾ Ð¾Ñ\81обнÑ\8b Ð´Ð°Ñ\82а
 ** Потенціално огварячі дата',
 'revdelete-otherreason' => 'Інша/далша причіна:',
 'revdelete-reasonotherlist' => 'Інша причіна',
@@ -1127,8 +1127,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 +1223,7 @@ $1",
 'timezoneregion-indian' => 'Індійскый океан',
 'timezoneregion-pacific' => 'Тихый океан',
 'allowemail' => 'Поволити електронічну пошту од іншых хоснователїв',
-'prefs-searchoptions' => 'Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b Ð³ляданя',
+'prefs-searchoptions' => 'Ð\93ляданя',
 'prefs-namespaces' => 'Просторы назв',
 'defaultns' => 'Інакше глядати в такых просторах назв:',
 'default' => 'імпліцітне',
@@ -1631,7 +1629,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».',
@@ -2712,7 +2710,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Тестованя JavaScript',
-'javascripttest-disabled' => 'Тота функція не дозволена на тій вікі.',
 'javascripttest-title' => 'Біжать тест в $1',
 'javascripttest-pagetext-noframework' => 'Тота сторінка є резервована про тестованя JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Незнаный фреймворк тестованя „$1“.',
@@ -2817,11 +2814,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 +3659,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..d83b5df 100644 (file)
@@ -424,7 +424,6 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
 'qbbrowse' => 'ब्राउस् इत्येतत् करोतु।',
 'qbedit' => 'सम्पाद्यताम्',
 'qbpageoptions' => 'इदं पृष्ठम्',
-'qbpageinfo' => 'प्रसंगः',
 'qbmyoptions' => 'मम पृष्ठानि',
 'qbspecialpages' => 'विशेषपृष्ठानि',
 'faq' => 'बहुधा पृच्छ्यमानाः प्रश्नाः',
@@ -679,7 +678,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''भवान् अधुना बहिरागतः ।'''
 
-भवान् {{SITENAME}} इत्येतत् अनामतया प्रयोक्तुं शक्नोति, अथवा भवान् तेनैव प्रयोक्तृनाम्ना, भिन्नप्रयोक्तृनाम्ना वा  [[Special:UserLogin|पुनः प्रवेष्टुं शक्नोति]]
+भवान् {{SITENAME}} इत्येतत् अनामतया प्रयोक्तुं शक्नोति, अथवा भवान् तेनैव प्रयोक्तृनाम्ना, भिन्नप्रयोक्तृनाम्ना वा  <span class='plainlinks'>[$1 पुनः प्रवेष्टुं शक्नोति]</span>
 इदानीमपि कानिचन पृष्ठानि पूर्ववदेव दृश्येरन् । अस्य वारणाय विचरकस्य स्मृतिसञ्चयः रिक्तीक्रियताम् ।",
 'welcomecreation' => '==स्वागतम्‌, $1!==
 भवता सदस्यता प्राप्ता अस्ति।
@@ -1075,7 +1074,7 @@ $2
 'viewpagelogs' => 'अस्य पृष्ठस्य लॉंग् इत्येतद् दर्शयतु',
 'nohistory' => 'अस्य पृष्ठस्य कृते पृष्ठेतिहासः न वर्तते।',
 'currentrev' => 'सद्यःकालीना आवृत्तिः',
-'currentrev-asof' => 'वरà¥\8dतमतà¥\80 आवृत्तिः $1 इति समये',
+'currentrev-asof' => 'वरà¥\8dतमाना आवृत्तिः $1 इति समये',
 'revisionasof' => '$1 इत्यस्य आवृत्तिः',
 'revision-info' => '$1इति समयस्य आवृत्तिः $2 इत्यनेन',
 'previousrevision' => '← पुरातनानि संस्करणानि',
@@ -1273,8 +1272,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 +1888,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' => 'आयामाः',
@@ -2860,7 +2857,6 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 
 # JavaScriptTest
 'javascripttest' => 'जावालिपिपरीक्षणम् ।',
-'javascripttest-disabled' => 'विक्याम् अयं क्रियाकलापः निष्क्रियः ।',
 'javascripttest-title' => '$1 परीक्षाप्रचलति ।',
 'javascripttest-pagetext-noframework' => 'जावलिपिचालनपरीक्षार्थम् एतत्पुटम् आरक्षितम् ।',
 'javascripttest-pagetext-unknownframework' => 'अज्ञातपरीक्षाप्रक्रिया  $1',
@@ -2991,7 +2987,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 +3834,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..f126d89 100644 (file)
@@ -187,7 +187,6 @@ $messages = array(
 'qbbrowse' => 'Көр',
 'qbedit' => 'Уларыт',
 'qbpageoptions' => 'Бу сирэй',
-'qbpageinfo' => 'Ис хоһооно',
 'qbmyoptions' => 'Мин сирэйдэрим',
 'qbspecialpages' => 'Аналлаах сирэйдэр',
 'faq' => 'FAQ',
@@ -444,7 +443,7 @@ $2',
 'logouttext' => "'''Эн тиһиликтэн таҕыстыҥ.'''
 
 {{SITENAME}} ситим-сиргэ билигин урукку ааккынан буолбакка IP-аадырыһынан эрэ көстөҕүн.
-Салгыы ааккын ааттаабакка үлэлиэххин сөп, эбэтэр саҥаттан урукку ааккынан дуу, атын аатынан дуу [[Special:UserLogin|киириэххин]] сөп.
+Салгыы ааккын ааттаабакка үлэлиэххин сөп, эбэтэр саҥаттан урукку ааккынан дуу, атын аатынан дуу <span class='plainlinks'>[$1 киириэххин]</span> сөп.
 Сорох сирэйдэр өссө даҕаны эйигин урукку ааккынан көрдөрүөхтэрин сөп, ону суох гыныаххын баҕардаххына интэриниэт көрдөрөөччүҥ кээһин ыраастаа.",
 'welcomecreation' => '== Нөрүөн нөргүй, $1! ==
 Эн манна бэлиэтэнниҥ.
@@ -705,8 +704,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 +1058,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' => 'Туох баар аат далларыгар көрдөөһүн',
@@ -2666,7 +2663,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript тургутуу',
-'javascripttest-disabled' => 'Дьайыы бу биикигэ араарыллыбат эбит.',
 'javascripttest-title' => '$1 тургутуу бара турар',
 'javascripttest-pagetext-noframework' => 'Бу сирэй JavaScript тургутууларга анаммыт.',
 'javascripttest-pagetext-unknownframework' => '"$1" тургутуу биллибэт эйгэтэ.',
@@ -3631,6 +3627,10 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'feedback-bugcheck' => 'Бэрт! Ол гынан баран [$1 биллэр алҕастарын] тиһилигэр майгынныыр сурук суоҕун тургут.',
 'feedback-bugnew' => 'Мин тургуттум. Атын алҕас туһунан',
 
+# Search suggestions
+'searchsuggest-search' => 'Көрдөөһүн',
+'searchsuggest-containing' => 'тыл баар ыстатыйалара...',
+
 # API errors
 'api-error-badaccess-groups' => 'Эн бу биикигэ билэ киллэрэриҥ хааччахтаммыт.',
 'api-error-badtoken' => 'Ис алҕас: Омсолоох токен.',
index dd50025..5c89ca8 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',
@@ -650,7 +649,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',
index 560516f..5e034bc 100644 (file)
@@ -392,7 +392,7 @@ 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.
@@ -650,8 +650,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'''.",
@@ -1560,4 +1558,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 a372b64..ee0e3f7 100644 (file)
@@ -280,7 +280,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',
@@ -520,7 +519,7 @@ 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! ==
 
@@ -997,8 +996,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',
@@ -2987,6 +2984,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..4b08c9c 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',
@@ -731,8 +730,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'''.",
index 80a7268..2037c5e 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)',
@@ -790,8 +789,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',
index f25c1fb..42e45b4 100644 (file)
@@ -206,7 +206,6 @@ $messages = array(
 'qbbrowse' => 'Bláđe',
 'qbedit' => 'Rievdat',
 'qbpageoptions' => 'Siidoásahusat',
-'qbpageinfo' => 'Siiddu dieđut',
 'qbmyoptions' => 'Ásahusat',
 'qbspecialpages' => 'Doaibmasiiddut',
 
@@ -1446,4 +1445,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 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..7982896 100644 (file)
@@ -393,7 +393,7 @@ 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! ==
 
@@ -751,8 +751,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',
index a11933a..c37b4e4 100644 (file)
@@ -352,7 +352,6 @@ $messages = array(
 'qbbrowse' => 'Prelistajte',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Opcije stranice',
-'qbpageinfo' => 'Informacije o stranici',
 'qbmyoptions' => 'Moje opcije',
 'qbspecialpages' => 'Posebne stranice',
 'faq' => 'ČPP',
@@ -616,7 +615,7 @@ 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.
@@ -1252,8 +1251,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',
@@ -2898,7 +2895,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“.',
@@ -3030,7 +3026,6 @@ 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)',
index cc05670..7cb6512 100644 (file)
@@ -269,6 +269,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',
@@ -636,8 +638,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..936f8db 100644 (file)
@@ -339,7 +339,6 @@ $messages = array(
 'qbbrowse' => 'පිරික්සන්න',
 'qbedit' => 'සංස්කරණය',
 'qbpageoptions' => 'මෙම පිටුව',
-'qbpageinfo' => 'සන්දර්භය',
 'qbmyoptions' => 'මගේ පිටු',
 'qbspecialpages' => 'විශේෂ පිටු',
 'faq' => 'නිවිප්‍ර',
@@ -602,7 +601,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ඔබ දැන් ගිණුමෙන් නික්මී ඇත.'''
 
-ඔබට නිර්නාමිකව {{SITENAME}} කටයුතු කරගෙන යාහැක, නැතහොත් පෙර පරිශීලක ලෙස හෝ වෙනත් පරිශීලකයෙකු ලෙස [[Special:UserLogin|නැවත ගිණුමක‍ට පිවිසිය හැක]].
+ඔබට නිර්නාමිකව {{SITENAME}} කටයුතු කරගෙන යාහැක, නැතහොත් පෙර පරිශීලක ලෙස හෝ වෙනත් පරිශීලකයෙකු ලෙස <span class='plainlinks'>[$1 නැවත ගිණුමක‍ට පිවිසිය හැක]</span>.
 ඔබගේ බ්‍රවුසරයෙහි පූර්වාපේක්‍ෂී සංචිතය (කෑෂය) පිරිසිදුකරන තෙක්, සමහරක් පිටු විසින් ඔබ තවදුරටත් පිවිසී ඇති බවක් දිගටම පෙන්නුම් කිරීමට ඉඩ ඇත.",
 'welcomecreation' => '== ආයුබෝවන්, $1! ==
 
@@ -866,7 +865,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:පෙර-දසුන පෙන්වන්න}}\" බොත්තම භාවිතා කරන්න.",
@@ -1115,7 +1113,8 @@ $1",
 'revdelete-only-restricted' => '$2 දිනැති අයිතමය සැඟවීමේ දෝෂය , $1:අනෙකුත් සැඟවීම් විකල්පයන් අතුරින් එකක් තෝරාගන්නේ නැතිව, පරිපාලකයන්ගේ දර්ශනයෙන් අයිතමයන් සැඟවීම  ඔබහට සිදුකල නොහැක.',
 'revdelete-reason-dropdown' => '*මකා දැමීමේ පොදු හේතු
 **කතු හිමිකම් උල්ලංඝනය
-**නුසුදුසු පුද්ගලික කොරතුරු
+**නුසුදුසු පරිකථන හෝ පුද්ගලික කොරතුරු
+**නුසුදුසු පරිශීලක නම
 **අපහාසාත්මක විය හැකි තොරතුරු',
 'revdelete-otherreason' => 'වෙනත්/අමතර හේතු:',
 'revdelete-reasonotherlist' => 'වෙනත් හේතු',
@@ -1125,7 +1124,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 +1208,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' => 'සියළු නාමඅවකාශයන්හි ගවේෂණය කරන්න',
@@ -1734,7 +1731,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" හී අගුළු ඇරිය නොහැක; එය අගුළු දමාද නොමැත.',
@@ -3925,6 +3922,10 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 'feedback-bugcheck' => 'කදිමයි! දැන් එය දැනටමත් [$1 හඳුනාගත් දෝෂ]වල තිබේ දැයි පිරික්සන්න.',
 'feedback-bugnew' => 'මම පරික්ෂා කළා. නව දෝෂය වාර්තා කරන්න',
 
+# Search suggestions
+'searchsuggest-search' => 'ගවේශණය කරන්න',
+'searchsuggest-containing' => 'ඇතුළත් වෙමින් පවතී...',
+
 # API errors
 'api-error-badaccess-groups' => 'මෙම විකියට ගොනු උඩුගතකිරීම සඳහා ඔබට අවසර නැත.',
 'api-error-badtoken' => 'අභ්‍යන්තර දෝෂය: නොසුදුසු ටෝකනය.',
index 757c47d..d4b6883 100644 (file)
@@ -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',
@@ -659,8 +658,11 @@ 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',
@@ -686,7 +688,7 @@ 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! ==
 
@@ -950,7 +952,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 +1059,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 +1089,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 +1323,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 +1417,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ý',
@@ -2497,7 +2507,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í]].",
@@ -2811,6 +2822,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 +2901,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 +2934,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 +2948,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“.',
@@ -3075,12 +3090,32 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
 'pageinfo-title' => 'Informácie o „$1“',
 '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-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',
 
 # Skin names
 'skinname-standard' => 'Klasický',
@@ -3135,6 +3170,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 +3180,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',
@@ -3664,6 +3702,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
@@ -3938,6 +3977,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 87f7e5a..909beac 100644 (file)
@@ -329,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',
@@ -342,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',
@@ -470,7 +469,7 @@ $1',
 'restorelink' => '$1 {{PLURAL:$1|izbrisano redakcijo|izbrisani redakciji|izbrisane redakcije|izbrisanih redakcij}}',
 'feedlinks' => 'Podajanje:',
 'feed-invalid' => 'Neveljavna vrsta naročniškega vira.',
-'feed-unavailable' => 'Živi zaznamki niso na voljo',
+'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«',
@@ -551,8 +550,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 />
@@ -596,7 +595,7 @@ 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.
@@ -862,6 +861,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.',
@@ -958,8 +961,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.
@@ -969,6 +972,12 @@ Izgleda, da je bila izbrisana.',
 'edit-already-exists' => 'Ni bilo mogoče ustvariti nove strani, ker že obstaja.',
 'defaultmessagetext' => 'Prednastavljeno besedilo',
 
+# 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.
 
@@ -1179,6 +1188,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',
@@ -1221,8 +1234,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',
@@ -1710,7 +1721,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]:
 
@@ -1730,7 +1741,7 @@ Prosimo, preverite veljavnost in dostopnost naslova URL ter poskusite ponovno.
 'upload-too-many-redirects' => 'URL vsebuje preveč preusmeritev',
 '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.',
@@ -1830,8 +1841,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' => 'Licenca:',
+'license-header' => 'Licenca',
 'nolicense' => 'Nobeno',
 'license-nopreview' => '(Predogled ni na voljo)',
 'upload_source_url' => ' (veljaven, javnosti dostopen URL)',
@@ -1869,10 +1880,10 @@ Ko so rezultati filtrirani po uporabniku, so prikazane samo datoteke, pri kateri
 'filehist-comment' => 'Komentar',
 'filehist-missing' => 'Datoteka manjka',
 'imagelinks' => 'Uporaba datoteke',
-'linkstoimage' => 'Datoteka je del {{PLURAL:$1|naslednje $1 strani|naslednjih $1 strani|naslednjih $1 strani|naslednjih $1 strani}} {{GRAMMAR:rodilnik|{{SITENAME}}}}:',
+'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 razpolago 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',
@@ -1892,14 +1903,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.',
@@ -2156,8 +2167,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',
@@ -2306,7 +2317,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šnjo redakcijo.',
 'deletecomment' => 'Razlog:',
 'deleteotherreason' => 'Drugi/dodatni razlogi:',
 'deletereasonotherlist' => 'Drug razlog',
@@ -2441,8 +2452,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]].",
@@ -2607,7 +2618,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',
@@ -2756,10 +2767,10 @@ strani ni mogoče prestaviti samo vaše.',
 '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.
@@ -2881,7 +2892,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«.',
@@ -2954,7 +2964,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',
@@ -3010,9 +3020,10 @@ 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',
 
 # Patrolling
 'markaspatrolleddiff' => 'Označite kot nadzorovano',
@@ -3055,7 +3066,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',
@@ -3593,6 +3604,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
@@ -3702,7 +3714,7 @@ 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-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.
@@ -3871,6 +3883,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.',
index 440dfd9..55f3980 100644 (file)
@@ -160,7 +160,6 @@ $messages = array(
 'qbfind' => 'Fenda',
 'qbedit' => 'Ändern',
 'qbpageoptions' => 'Seytaoptiona',
-'qbpageinfo' => 'Seytadata',
 'qbmyoptions' => 'Menne Seyta',
 'qbspecialpages' => 'Spezialseyta',
 'faq' => 'FAQ',
@@ -363,7 +362,7 @@ 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! ==
 
@@ -798,8 +797,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',
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..7aafdc9 100644 (file)
@@ -154,7 +154,6 @@ $messages = array(
 'qbbrowse' => 'Ka soo raadi',
 'qbedit' => 'Wax ka bedel',
 'qbpageoptions' => 'Boggaan',
-'qbpageinfo' => 'isku xiran',
 'qbmyoptions' => 'Boggageyga',
 'qbspecialpages' => 'Bogaga qaaska ah',
 'faq' => 'SIL',
@@ -366,7 +365,7 @@ 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.",
+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.",
 'welcomecreation' => "== Soo dhawoow, $1! ==
 Akoon kaada  waa la sameeyay.
 Ha' hilmaamin in aad wax ka bedesho [[Special:Preferences|{{SITENAME}} dooqyadaada]].",
@@ -737,8 +736,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 +1389,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..efd1cb5 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',
@@ -626,7 +625,7 @@ 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. 
@@ -1229,8 +1228,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',
@@ -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 fa46348..98501b2 100644 (file)
@@ -541,7 +541,6 @@ $messages = array(
 'qbbrowse' => 'Потражи',
 'qbedit' => 'Уреди',
 'qbpageoptions' => 'Поставке странице',
-'qbpageinfo' => 'Садржај странице',
 'qbmyoptions' => 'Моје странице',
 'qbspecialpages' => 'Посебне странице',
 'faq' => 'НПП',
@@ -554,7 +553,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,7 +812,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Одјављени сте.'''
 
-Можете да наставите с коришћењем овог викија као гост, или се [[Special:UserLogin|поново пријавите]] као други корисник.
+Можете да наставите с коришћењем овог викија као гост, или се <span class='plainlinks'>[$1 поново пријавите]</span> као други корисник.
 Имајте на уму да неке странице могу наставити да се приказују као да сте још пријављени, све док не очистите привремену меморију свог прегледача.",
 'welcomecreation' => '== Добро дошли, $1! ==
 
@@ -1190,6 +1189,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 +1456,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' => 'сви именски простори',
@@ -2128,7 +2134,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',
@@ -2685,7 +2691,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|историју брисања]] за записе о скорашњим брисањима и враћањима.",
@@ -2996,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' => 'Екстензија нове датотеке се не поклапа с њеном врстом',
@@ -3126,7 +3134,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Јаваскрипт тест',
-'javascripttest-disabled' => 'Ова функција није омогућена на овом викију.',
 'javascripttest-title' => 'Извршавање тестова за $1',
 'javascripttest-pagetext-noframework' => 'Ова страница је резервисана за извршавање јаваскрипт тестова.',
 'javascripttest-pagetext-unknownframework' => 'Непознати радни оквир „$1“.',
@@ -3266,6 +3273,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Подаци о „$1“',
+'pageinfo-not-current' => 'Подаци могу бити приказани само за текућу измену.',
 'pageinfo-header-basic' => 'Основни подаци',
 'pageinfo-header-edits' => 'Историја измена',
 'pageinfo-header-restrictions' => 'Заштита странице',
@@ -3290,10 +3298,14 @@ $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' => 'Да',
 
 # Skin names
 'skinname-standard' => 'Класично',
@@ -3975,6 +3987,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[Међувики укључивање шаблона је онемогућено]',
 'scarytranscludefailed' => '[Добављање шаблона за $1 није успело]',
+'scarytranscludefailed-httpstatus' => '[Не могу да преузмем шаблон $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL адреса је предугачка]',
 
 # Delete conflict
@@ -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 81f6bcc..fd17f26 100644 (file)
@@ -450,7 +450,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 +462,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,7 +721,7 @@ 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! ==
 
@@ -1099,6 +1098,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 +1365,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',
@@ -2037,7 +2043,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',
@@ -2594,7 +2600,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.",
@@ -2905,6 +2912,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 +3043,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 +3182,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' => 'Podaci mogu biti prikazani samo za tekuću izmenu.',
 'pageinfo-header-basic' => 'Osnovni podaci',
 'pageinfo-header-edits' => 'Istorija izmena',
 'pageinfo-header-restrictions' => 'Zaštita stranice',
@@ -3199,10 +3207,14 @@ 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',
 
 # Skin names
 'skinname-standard' => 'Klasično',
@@ -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
@@ -4236,6 +4249,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 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..59d01a1 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,7 +442,7 @@ 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 ==
 
@@ -1007,8 +1006,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',
@@ -3301,4 +3298,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..dd44a09 100644 (file)
@@ -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,7 +517,7 @@ 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.
@@ -1073,8 +1072,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',
@@ -3062,6 +3059,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 8007de1..7a310a7 100644 (file)
@@ -40,6 +40,7 @@
  * @author Rotsee
  * @author S.Örvarr.S
  * @author Sannab
+ * @author Sendelbach
  * @author Sertion
  * @author Skalman
  * @author Stefan2
@@ -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',
@@ -726,7 +726,7 @@ 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.
@@ -1085,6 +1085,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.
@@ -1342,8 +1351,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',
@@ -2538,7 +2545,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.",
@@ -2840,6 +2848,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',
@@ -2967,7 +2976,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".',
@@ -3117,7 +3125,7 @@ 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-robot-policy' => 'Sökmotordirektiv',
 'pageinfo-robot-index' => 'Indexerbar',
 'pageinfo-robot-noindex' => 'Inte indexerbar',
 'pageinfo-views' => 'Antal visningar',
@@ -3133,10 +3141,10 @@ 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',
 
 # Skin names
 'skinname-standard' => 'Standard',
@@ -3716,6 +3724,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
@@ -3994,6 +4003,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.',
index 9ea67af..ee81d3a 100644 (file)
@@ -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',
@@ -527,7 +526,7 @@ Sababu zilizotolewa ni "\'\'$2\'\'".',
 # 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.",
+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.",
 'welcomecreation' => '== Karibu, $1! ==
 Ushafunguliwa akaunti yako tayari.
 Usisahau kubadilisha mapendekezo yako ya [[Special:Preferences|{{SITENAME}}]].',
@@ -1098,8 +1097,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',
@@ -3157,6 +3154,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..350ba98 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,7 +450,7 @@ 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.
@@ -967,8 +966,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',
index ac40d29..daf40e2 100644 (file)
@@ -225,7 +225,6 @@ $messages = array(
 'qbbrowse' => 'உலவு',
 'qbedit' => 'தொகு',
 'qbpageoptions' => 'பக்க விருப்பத் தேர்வுகள்',
-'qbpageinfo' => 'பக்கத் தகவல்கள்',
 'qbmyoptions' => 'என் விருப்பத்தேர்வுகள்',
 'qbspecialpages' => 'சிறப்புப் பக்கங்கள்',
 'faq' => 'அடிக்கடி கேட்கப்படும் கேள்விகள்',
@@ -479,7 +478,7 @@ MySQL returned error "$3: $4".',
 # Login and logout pages
 'logouttext' => "'''நீங்கள் இப்பொழுது விடுபதிகையில் உள்ளீர்கள்.'''
 
-நீங்கள் தொடர்ந்து {{SITENAME}} தளத்தை அனானியாகப் பயன்படுத்தலாம், அல்லது அதே பயனராகவோ வேறு பயனராகவோ [[Special:UserLogin|மீண்டும் புகுபதிகை]] செய்யலாம். உங்கள் உலாவியின் இடைமாற்று நீக்கப்படும் வரை சில பக்கங்கள் தொடர்ந்தும் புகுபதிகையில் உள்ளது போன்றே காட்சி தரும் என்பதைக் கவனிக்கவும்.",
+நீங்கள் தொடர்ந்து {{SITENAME}} தளத்தை அனானியாகப் பயன்படுத்தலாம், அல்லது அதே பயனராகவோ வேறு பயனராகவோ <span class='plainlinks'>[$1 மீண்டும் புகுபதிகை]</span> செய்யலாம். உங்கள் உலாவியின் இடைமாற்று நீக்கப்படும் வரை சில பக்கங்கள் தொடர்ந்தும் புகுபதிகையில் உள்ளது போன்றே காட்சி தரும் என்பதைக் கவனிக்கவும்.",
 'welcomecreation' => '==நல்வரவு, $1!==
 உங்களுக்கான பயனர் கணக்கு உருவாக்கப்பட்டுள்ளது. உங்களுக்கேற்றவாறு [[Special:Preferences|{{SITENAME}} விருப்பத்தேர்வுகளை]] மாற்றிக் கொள்ள மறவாதீர்கள்.',
 'yourname' => 'பயனர் பெயர்:',
@@ -1070,8 +1069,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' => 'அனைத்துப் பெயர்வெளிகளிலும் தேடவும்',
@@ -2612,7 +2609,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'சாவாநிரல் சோதனை நடக்கின்றது',
-'javascripttest-disabled' => 'இந்தச் செயல்பாடு முடக்கப்பட்டுள்ளது.',
 'javascripttest-title' => '$1 சோதனைகள் நடக்கின்றன',
 'javascripttest-pagetext-noframework' => 'இந்த பக்கம் JavaScript பரிசோதனை ஓட்டத்திற்காக ஒதுக்கப்பட்டுள்ளது',
 'javascripttest-pagetext-skins' => 'சோதனைகளை நடத்த முகப்புறை ஒன்றைத் தேர்வுசெய்:',
@@ -3541,6 +3537,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..ecb1d83 100644 (file)
@@ -584,8 +584,6 @@ $messages = array(
 'search-interwiki-caption' => 'ಬಳಗದ ಇತರ ಯೋಜನೆಲು',
 'search-interwiki-default' => '$1 ಫಲಿತಾಂಶೊಲು:',
 'search-interwiki-more' => '(ಮಸ್ತ್)',
-'search-mwsuggest-enabled' => 'ಸಲಹೆದೊಟ್ಟಿಗೆ',
-'search-mwsuggest-disabled' => 'ಓವು ಸಲಹೆಲಾ ಇಜ್ಜಿ',
 'searchrelated' => 'ಸ೦ಬ೦ಧ ಇತ್ತಿನ',
 'searchall' => 'ಮಾತಾ',
 'powersearch' => 'ನಾಡ್’ಲೆ',
index 9cd12cb..5bbccf2 100644 (file)
@@ -287,7 +287,6 @@ $messages = array(
 'qbbrowse' => 'విహరించు',
 'qbedit' => 'సవరించు',
 'qbpageoptions' => 'ఈ పేజీ',
-'qbpageinfo' => 'సందర్భం',
 'qbmyoptions' => 'నా పేజీలు',
 'qbspecialpages' => 'ప్రత్యేక పేజీలు',
 'faq' => 'తరచూ అడిగే ప్రశ్నలు',
@@ -300,7 +299,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,7 +541,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ఇప్పుడు మీరు నిష్క్రమించారు.'''
 
-మీరు {{SITENAME}}ని అజ్ఞాతంగా వాడుతూండొచ్చు, లేదా ఇదే వాడుకరిగా కానీ లేదా వేరే వాడుకరిగా కానీ [[Special:UserLogin|మళ్ళీ ప్రవేశించవచ్చు]].
+మీరు {{SITENAME}}ని అజ్ఞాతంగా వాడుతూండొచ్చు, లేదా ఇదే వాడుకరిగా కానీ లేదా వేరే వాడుకరిగా కానీ <span class='plainlinks'>[$1 మళ్ళీ ప్రవేశించవచ్చు]</span>.
 అయితే, మీ విహారిణిలోని కోశాన్ని శుభ్రపరిచే వరకు కొన్ని పేజీలు మీరింకా ప్రవేశించి ఉన్నట్లుగానే చూపించవచ్చని గమనించండి.",
 'welcomecreation' => '== స్వాగతం, $1! ==
 
@@ -789,8 +788,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' => 'ప్రస్తుతం ఈ వాడుకరిని నిరోధించారు.
@@ -886,6 +884,11 @@ $2
 అది ఇప్పటికే ఉంది.',
 'defaultmessagetext' => 'అప్రమేయ సందేశపు పాఠ్యం',
 
+# Content models
+'content-model-wikitext' => 'వికీపాఠ్యం',
+'content-model-text' => 'సాదా పాఠ్యం',
+'content-model-javascript' => 'జావాస్క్రిప్ట్',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'హెచ్చరిక: ఈ పేజీలో ఖరీదైన పార్సరు పిలుపులు చాలా ఉన్నాయి.
 
@@ -1127,8 +1130,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' => 'అన్ని పేరుబరుల్లో వెతుకు',
@@ -1987,6 +1988,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'mailnologin' => 'పంపించవలసిన చిరునామా లేదు',
 'mailnologintext' => 'ఇతరులకు ఈ-మెయిలు పంపించాలంటే, మీరు [[Special:UserLogin|లాగిన్‌]] అయి ఉండాలి, మరియు మీ [[Special:Preferences|అభిరుచుల]]లో సరైన ఈ-మెయిలు చిరునామా ఇచ్చి ఉండాలి.',
 'emailuser' => 'ఈ వాడుకరికి ఈ-మెయిలుని పంపించండి',
+'emailuser-title-target' => 'ఈ {{GENDER:$1|వాడుకరికి}} ఈమెయిలు పంపించండి',
 'emailpage' => 'వాడుకరికి ఈ-మెయిలుని పంపించు',
 'emailpagetext' => 'వాడుకరికి ఈమెయిలు సందేశము పంపించుటకు క్రింది ఫారంను ఉపయోగించవచ్చు. [[Special:Preferences|మీ వాడుకరి అభిరుచుల]]లో మీరిచ్చిన ఈ-మెయిలు చిరునామా "నుండి" ఆ సందేశం వచ్చినట్లుగా ఉంటుంది, కనుక వేగుని అందుకునేవారు నేరుగా మీకు జవాబివ్వగలుగుతారు.',
 'usermailererror' => 'మెయిలు ఆబ్జెక్టు ఈ లోపాన్ని చూపింది:',
@@ -2740,6 +2742,7 @@ $UNWATCHURL కి వెళ్ళండి.
 'pageinfo-views' => 'వీక్షణల సంఖ్య',
 'pageinfo-watchers' => 'పేజీ వీక్షకుల సంఖ్య',
 'pageinfo-edits' => 'మొత్తం మార్పుల సంఖ్య',
+'pageinfo-toolboxlink' => 'పేజీ సమాచారం',
 
 # Skin names
 'skinname-standard' => 'సంప్రదాయ',
@@ -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..d4600e0 100644 (file)
@@ -412,8 +412,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',
index 76b0027..0cd2c9b 100644 (file)
@@ -213,7 +213,6 @@ $messages = array(
 'qbbrowse' => 'Мурур',
 'qbedit' => 'Вироиш',
 'qbpageoptions' => 'Ин саҳифа',
-'qbpageinfo' => 'Бофт',
 'qbmyoptions' => 'Саҳифаҳои ман',
 'qbspecialpages' => 'Саҳифаҳои вижа',
 'faq' => 'Саволҳои тез-тез пурсидашуда',
@@ -444,7 +443,7 @@ $1',
 # Login and logout pages
 'logouttext' => "'''Акнун аз систем хориҷ шудаед.'''
 
-Шумо метавонед гумном аз {{SITENAME}} истифодабариро идома диҳед, ё метавонед бо ҳамин номи корбариатон ва ё номи корбарии дигаре [[Special:UserLogin|боз вуруд кунед]].
+Шумо метавонед гумном аз {{SITENAME}} истифодабариро идома диҳед, ё метавонед бо ҳамин номи корбариатон ва ё номи корбарии дигаре <span class='plainlinks'>[$1 боз вуруд кунед]</span>.
 Тавваҷӯҳ кунед, ки баъзе аз саҳифаҳо қаблан чи тавре намоиш шуда будан ҳамин тавр намоиш дода мешаванд, то даме ки шумо ҳофизаи мурургаратонро пок кунед.",
 'welcomecreation' => '== Хуш омадед, $1! ==
 
@@ -760,6 +759,7 @@ $1',
 'revdelete-success' => "'''Тағйири намоёнии нусха бо муваффақият анҷом шуд.'''",
 'logdelete-success' => "'''Тағйири намоёнии маврид бо муваффақият анҷом шуд.'''",
 'revdel-restore' => 'Тағйири падидорӣ',
+'revdel-restore-visible' => 'нусхаҳои намоён',
 'pagehist' => 'Таърихи саҳифа',
 'deletedhist' => 'Таърихи ҳазфшуда',
 'revdelete-edit-reasonlist' => 'Вироиш ҳазф далелҳо',
@@ -836,8 +836,6 @@ $1',
 'search-interwiki-caption' => 'Лоиҳаҳои хоҳарӣ',
 'search-interwiki-default' => '$1 натоиҷ:',
 'search-interwiki-more' => '(бештар)',
-'search-mwsuggest-enabled' => 'бо тавзеҳот',
-'search-mwsuggest-disabled' => 'бидуни тавзеҳот',
 'search-relatedarticle' => 'Алоқаманд',
 'searchrelated' => 'алоқаманд',
 'searchall' => 'ҳама',
@@ -1179,7 +1177,7 @@ $1',
 'filehist-dimensions' => 'Андоза',
 'filehist-filesize' => 'Андозаи парванда',
 'filehist-comment' => 'Тавзеҳ',
-'imagelinks' => 'Ð\9fайвандҳои парванда',
+'imagelinks' => 'Ð\98Ñ\81Ñ\82иÑ\84одаи парванда',
 'linkstoimage' => '{{PLURAL:$1|Саҳифаҳои|$1 Саҳифаи}} зерин ба ин акс пайванданд:',
 'nolinkstoimage' => 'Ҳеҷ саҳифае ба ин акс пайванд надорад.',
 'sharedupload' => 'Ин парванда аз $1 мебошад ва шояд аз тарафи дигар лоиҳаҳо истифода шавад.',
index 82d419a..bf09f81 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,7 +378,7 @@ 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! ==
 
@@ -724,8 +723,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',
index ec4f919..523fa4d 100644 (file)
@@ -328,7 +328,6 @@ $messages = array(
 'qbbrowse' => 'สืบค้น',
 'qbedit' => 'แก้ไข',
 'qbpageoptions' => 'หน้านี้',
-'qbpageinfo' => 'บริบท',
 'qbmyoptions' => 'หน้าของฉัน',
 'qbspecialpages' => 'หน้าพิเศษ',
 'faq' => 'คำถามถามบ่อย',
@@ -574,7 +573,7 @@ $1',
 # Login and logout pages
 'logouttext' => "'''ขณะนี้คุณได้ล็อกเอาต์ออกจากระบบ'''
 
-คุณสามารถใช้งาน {{SITENAME}} ได้ต่อในฐานะผู้ใช้นิรนาม หรือคุณสามารถ[[Special:UserLogin|ล็อกอินกลับเข้าไป]]ด้วยชื่อผู้ใช้เดิมหรือชื่อผู้ใช้อื่นๆ
+คุณสามารถใช้งาน {{SITENAME}} ได้ต่อในฐานะผู้ใช้นิรนาม หรือคุณสามารถ<span class='plainlinks'>[$1 ล็อกอินกลับเข้าไป]</span>ด้วยชื่อผู้ใช้เดิมหรือชื่อผู้ใช้อื่นๆ
 อย่างไรก็ตามอาจจะมีบางหน้าที่ยังแสดงข้อความว่าคุณกำลังล็อกอินอยู่ จนกว่าคุณจะล้างแคชออกจากเว็บเบราว์เซอร์",
 'welcomecreation' => '== ยินดีต้อนรับ $1! ==
 
@@ -796,8 +795,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' => 'ปัจจุบันเลขที่อยู่ไอพีนี้ถูกบล็อก
@@ -1137,8 +1135,6 @@ $1",
 'search-interwiki-caption' => 'โครงการพี่น้อง',
 'search-interwiki-default' => '$1 ผลลัพธ์:',
 'search-interwiki-more' => '(มากกว่า)',
-'search-mwsuggest-enabled' => 'พร้อมคำแนะนำ',
-'search-mwsuggest-disabled' => 'ไม่รวมคำแนะนำ',
 'search-relatedarticle' => 'สัมพันธ์',
 'mwsuggest-disable' => 'ยกเลิกการแนะนำในลักษณะเอแจ็กซ์',
 'searcheverything-enable' => 'สืบค้นในเนมสเปซทั้งหมด',
@@ -2639,7 +2635,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'การทดสอบจาวาสคริปต์',
-'javascripttest-disabled' => 'ฟังก์ชั่นการทำงานนี้ถูกปิดการใช้งานอยู่',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'หน้าผู้ใช้ของคุณ',
@@ -3473,6 +3468,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..1ed97e9 100644 (file)
@@ -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',
@@ -422,7 +421,7 @@ 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! ==
 
@@ -975,8 +974,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',
@@ -3146,4 +3143,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..f4d5e20 100644 (file)
@@ -295,7 +295,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,7 +566,7 @@ 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.
@@ -1207,8 +1206,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:',
@@ -2849,7 +2846,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".',
@@ -3014,7 +3010,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)',
@@ -4068,6 +4063,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..48da335 100644 (file)
@@ -946,6 +946,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..c203762 100644 (file)
@@ -438,8 +438,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.",
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..c05c6fd 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',
@@ -887,4 +885,7 @@ Yu inap lukim as tok bilong em',
 # HTML forms
 'htmlform-selectorother-other' => 'Narapela',
 
+# Search suggestions
+'searchsuggest-search' => 'Painim',
+
 );
index 69cf14d..8aac893 100644 (file)
@@ -468,7 +468,6 @@ $messages = array(
 'qbbrowse' => 'Tara',
 'qbedit' => 'Değiştir',
 'qbpageoptions' => 'Bu sayfa',
-'qbpageinfo' => 'Bağlam',
 'qbmyoptions' => 'Sayfalarım',
 'qbspecialpages' => 'Özel sayfalar',
 'faq' => 'SSS',
@@ -723,7 +722,7 @@ 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! ==
 
@@ -1078,6 +1077,9 @@ Silinmiş görünüyor.',
 Sayfa zaten mevcut.',
 'defaultmessagetext' => 'Varsayılan mesaj metni',
 
+# Content models
+'content-model-javascript' => 'JavaScript',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Uyarı: Bu sayfa çok fazla zengin derleyici fonksiyonu çağrısı içeriyor.
 
@@ -1319,8 +1321,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',
@@ -2872,7 +2872,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',
@@ -2978,6 +2977,7 @@ Geçici dosya kayıp.',
 'pageinfo-header-edits' => 'Değişiklikler',
 'pageinfo-views' => 'Görüntülenme sayısı',
 'pageinfo-watchers' => 'İzleyen sayısı',
+'pageinfo-redirects-value' => '$1',
 'pageinfo-edits' => 'Değişiklik sayısı',
 
 # Skin names
@@ -3820,6 +3820,10 @@ 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.',
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..45cecda 100644 (file)
@@ -372,7 +372,7 @@ 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.
index c4b7190..ea2fc37 100644 (file)
@@ -606,7 +606,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Сез хисап язмагыздан чыктыгыз.'''
 
-Сез {{SITENAME}} проектында аноним рәвештә кала яисә шул ук яки башка исем белән яңадан [[Special:UserLogin|керә]] аласыз.
+Сез {{SITENAME}} проектында аноним рәвештә кала яисә шул ук яки башка исем белән яңадан <span class='plainlinks'>[$1 керә]</span> аласыз.
 Кайбер битләр Сез кергән кебек күрсәтелергә мөмкин. Моны бетерү өчен браузер кэшын чистартыгыз.",
 'welcomecreation' => '== Рәхим итегез, $1! ==
 Сез теркәлдегез.
@@ -1150,8 +1150,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' => 'Барлык исемнәр мәйданында эзләү',
@@ -2556,6 +2554,10 @@ $1',
 'feedback-close' => 'Әзер',
 'feedback-bugnew' => 'Мин тикшердем. Яңа хата турында хәбәр итү',
 
+# Search suggestions
+'searchsuggest-search' => 'Эзләү',
+'searchsuggest-containing' => 'эчтәлек...',
+
 # API errors
 'api-error-badaccess-groups' => 'Сезгә бу викигә файллар өстәү рөхсәт ителмәгән',
 'api-error-badtoken' => 'Эчке хата: дөрес булмаган токен.',
index db0507f..57755f7 100644 (file)
@@ -477,7 +477,7 @@ 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.
@@ -924,8 +924,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',
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..92291c9 100644 (file)
@@ -542,8 +542,6 @@ Please check if you want to create/edit this page.',
 'search-section' => '(«$1» деп салбыр)',
 'search-suggest' => 'Силер «$1» деп бодадыңар чадавас',
 'search-interwiki-more' => '(артык)',
-'search-mwsuggest-enabled' => 'саналдар',
-'search-mwsuggest-disabled' => 'саналдар чок',
 'searcheverything-enable' => 'Шупту аттар делгемнеринден дилээри',
 'searchrelated' => 'холбаалыг',
 'searchall' => 'шупту',
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..9cd4547 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,7 +470,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ھازىر تىزىمدىن چىقتىڭىز.'''
 
-سىز نامسىز ھالەتتە {{SITENAME}} نى ئىشلىتەلەيسىز ياكى ئوخشاش ۋە ياكى ئوخشاش بولمىغان ئىشلەتكۈچى سالاھىيىتىدە [[Special:UserLogin|تىزىمغا كىر]]ەلەيسىز.
+سىز نامسىز ھالەتتە {{SITENAME}} نى ئىشلىتەلەيسىز ياكى ئوخشاش ۋە ياكى ئوخشاش بولمىغان ئىشلەتكۈچى سالاھىيىتىدە <span class='plainlinks'>[$1 تىزىمغا كىر]</span>ەلەيسىز.
 دىققەت، بەزى بەتلەر توركۆرگۈنىڭ غەملىكى تازىلانمىغۇچە يەنىلا سىزنى تىزىمغا كىرگەن ھالەتتە كۆرسىتىشى مۇمكىن.",
 'welcomecreation' => '==  $1! خۇش كەپسىز ==
 
@@ -745,7 +747,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 +761,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 +863,7 @@ $2
 'edit-already-exists' => 'يېڭى بەت قۇرالمىدى
 ئۇ مەۋجۇد.',
 'defaultmessagetext' => 'كۆڭۈلدىكى ئۇچۇر تېكستى',
+'content-failed-to-parse' => '$2 نى $1 گە ئانالىز قلش مەغلۇپ بولدى: $3',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ئاگاھلاندۇرۇش:''' بۇ بەت ناھايىتى كۆپ يۇقىرى سەرپىياتتىكى گىرامماتىكىلىق ئىقتىدارنى چاقىرغان.\\n
@@ -1113,8 +1115,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 +1227,9 @@ $1",
 'username' => 'ئىشلەتكۇچى ئىسمى:',
 'uid' => 'ئىشلەتكۈچى كىملىك:',
 'prefs-memberingroups' => '{{PLURAL:$1|بىر|كۆپ}} گۇرۇپپا ئەزاسى:',
+'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'خەتلەتكەن ۋاقىت:',
+'prefs-registration-date-time' => '$1',
 'yourrealname' => 'ﺗﻮﻟﯘﻕ ئىسىم:',
 'yourlanguage' => 'تىل:',
 'yourvariant' => 'مەزمۇن تىل شالغۇتى:',
@@ -1293,6 +1295,7 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 'userrights-notallowed' => 'ھېساباتىڭىزنىڭ ئىشلەتكۈچى ھوقۇقىنى قوشۇش ياكى ئۆزگەرتىش ھوقۇقى يوق.',
 'userrights-changeable-col' => 'سىز ئۆزگەرتەلەيدىغان گۇرۇپپا',
 'userrights-unchangeable-col' => 'سىز ئۆزگەرتەلمەيدىغان گۇرۇپپا',
+'userrights-irreversible-marker' => '$1*',
 
 # Groups
 'group' => 'گۇرۇپپا:',
@@ -1447,9 +1450,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 +1892,7 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 # Book sources
 'booksources' => 'كىتاب مەنبەسى',
 'booksources-search-legend' => 'كىتاب مەنبەسى ئىزدە',
+'booksources-isbn' => 'ISBN:',
 'booksources-go' => 'يۆتكەل',
 'booksources-text' => 'تۆۋەندىكىسى بىر قىسىم تور كىتابخانىلىرىنىڭ تىزىملىكى، ئىچىدە سىز ئىزدىمەكچى بولغان كىتابلارنىڭ تېخىمۇ كۆپ ئۇچۇرى بولۇشى مۇمكىن:',
 'booksources-invalid-isbn' => 'تەمىنلىگەن ISBN نومۇرى توغرا ئەمەس. ئەسلى كۆچۈرگەن مەنبەدىكى نومۇردا خاتالىق بار يوقلۇقىنى تەكشۈرۈڭ.',
@@ -1972,6 +1978,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' => 'ھەممە گۇرۇپپىغا قوش',
@@ -2248,6 +2255,7 @@ $2 نىڭ ئاخىرقى تۈزىتىلگەن نەشرىگە ئۆزگەرتىل
 
  [[Special:Log/delete|ئۆچۈرۈش خاتىرىسى]]دىن پايدىلىنىپ ئۆچۈر ۋە ئەسلىگە كەلتۈر خاتىرىسىنى كۆرۈڭ.",
 'undelete-header' => 'يېقىنقى خاتىرىنى سۈرۈشتۈرمەكچى بولسىڭىز [[Special:Log/delete|ئۆچۈرۈش خاتىرىسى]]دىن پايدىلىنىڭ.',
+'undelete-search-title' => 'ئۆچۈرۈئتلگەن بەتنى ئزدەش',
 'undelete-search-box' => 'ئۆچۈرۈلگەن بەتنى ئىزدە',
 'undelete-search-prefix' => 'باشلانغان بەتنى كۆرسەت:',
 'undelete-search-submit' => 'ئىزدەش',
@@ -2263,6 +2271,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 +2452,7 @@ $1',
 'proxyblockreason' => 'IP ئادرېسىڭىز ئوچۇق ۋاكالەتچى، ئۇ ئاللىبۇرۇن چەكلەنگەن.
 ئىنتېرنېت مۇلازىمىتى تەمىنلىگۈچى سودىگەر ياكى تېخنىكىلىق قوللىغۇچى بىلەن ئالاقىلىشىڭ ھەمدە ئۇلارغا بۇ ئېغىر بىخەتەرلىك مەسىلىسىنى ئۇقتۇرۇڭ.',
 'proxyblocksuccess' => 'تامام',
+'sorbs' => 'DNSBL',
 'sorbsreason' => 'IP ئادرېسىڭىز {{SITENAME}} دا DNSBL تەرىپىدىن ئوچۇق ۋاكالەتچى تىزىملىكىگە قوشۇلغان.',
 'sorbs_create_account_reason' => 'IP ئادرېسىڭىز {{SITENAME}} دا DNSBL تەرىپىدىن ئوچۇق ۋاكالەتچى تىزىملىكىگە قوشۇلغان.
 شۇڭا سىز يېڭى ھېسابات قۇرالمايسىز.',
@@ -2578,6 +2588,7 @@ $1',
 بەت چىقىرىشتا، تۆۋەندىكى تېكست رامكىسىغا بەت ماۋزۇسىنى  كىرگۈزۈپ، ھەر بىر قۇردا بىر ماۋزۇ، ھەمدە بەت تارىخ بار  ئىلگىرىكى تۈزىتىلگەن نەشرىنى تاللامسىز يوق، ياكى پەقەت  ئاخىرقى قېتىملىق تەھرىر ئۇچۇرى بار نۆۋەتتىكى تۈزىتىلگەن  نەشرىنى چىقىرىشنى تاللاڭ.
 
 ئۇنىڭدىن باشقا ئۇلانمىدىن پايدىلىنىپ ھۆججەت چىقىرالايسىز،  مەسىلەن سىز [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] دىن پايدىلىنىپ  "[[{{MediaWiki:Mainpage}}]]"بەت چىقىرالايسىز.',
+'exportall' => 'بارلىق بەتنى چىقىرىش',
 'exportcuronly' => 'ھەممە تارىخنى ئەمەس بەلكى نۆۋەتتىكى تۈزىتىلگەن نەشرىنىلا ئۆز ئىچىگە ئالىدۇ.',
 'exportnohistory' => "----
 '''دىققەت:''' ئىقتىدار سەۋەبلىك بۇ جەدۋەلدىن ھەممە تارىخنى چىقىرىش چەكلەنگەن.",
@@ -2613,6 +2624,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 +2754,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 +2814,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 +2872,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 +2901,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 +2916,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 d27afaf..0315ba6 100644 (file)
@@ -499,7 +499,6 @@ $messages = array(
 'qbbrowse' => 'Переглянути',
 'qbedit' => 'Редагувати',
 'qbpageoptions' => 'Налаштування сторінки',
-'qbpageinfo' => 'Інформація про сторінку',
 'qbmyoptions' => 'Мої налаштування',
 'qbspecialpages' => 'Спеціальні сторінки',
 'faq' => 'Часті питання',
@@ -763,7 +762,7 @@ $1',
 # Login and logout pages
 'logouttext' => "'''Тепер ви працюєте в тому ж режимі, який був до вашого входу до системи.'''
 
-Ви можете продовжувати використовувати {{grammar:accusative|{{SITENAME}}}} анонімно або знову [[Special:UserLogin|ввійти до системи]] як той самий або інший користувач. Деякі сторінки можуть відображатися, ніби ви ще представлені системі під іменем, щоб уникнути цього, оновіть кеш браузера.",
+Ви можете продовжувати використовувати {{grammar:accusative|{{SITENAME}}}} анонімно або знову <span class='plainlinks'>[$1 ввійти до системи]</span> як той самий або інший користувач. Деякі сторінки можуть відображатися, ніби ви ще представлені системі під іменем, щоб уникнути цього, оновіть кеш браузера.",
 'welcomecreation' => '== Вітаємо вас, $1! ==
 Ваш обліковий запис створено.
 Не забудьте змінити свої [[Special:Preferences|налаштування для сайту]].',
@@ -1383,8 +1382,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' => 'Пошук у всіх просторах назв',
@@ -2638,7 +2635,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' => 'журнали',
@@ -3016,7 +3013,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Тестування JavaScript',
-'javascripttest-disabled' => 'Цю функцію відключено.',
 'javascripttest-title' => 'Працює  $1  випробувань',
 'javascripttest-pagetext-noframework' => 'Ця сторінка призначений для тестування JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Невідоме середовище тестування " $1 ".',
@@ -4198,6 +4194,10 @@ MediaWiki поширюється в надії, що вона буде кори
 'feedback-bugcheck' => 'Чудово! Просто перевірте, що це не одна з вже [$1 відомих помилок].',
 'feedback-bugnew' => 'Я перевірив. Повідомити про нову помилку',
 
+# Search suggestions
+'searchsuggest-search' => 'Пошук',
+'searchsuggest-containing' => 'що містять...',
+
 # API errors
 'api-error-badaccess-groups' => 'Вам не дозволено завантажувати файли до цього вікіпроекту.',
 'api-error-badtoken' => 'Внутрішня помилка: некоректний токен.',
index 048ca39..0dbd2cd 100644 (file)
@@ -418,7 +418,7 @@ Warning: Page may not contain recent updates.',
 # Login and logout pages
 'logouttext' => "'''اب آپ خارج ہوچکے ہیں'''
 
-آپ گمنام طور پر {{SITENAME}}  کا استعمال جاری رکھ سکتے ہیں، یا دوبارہ اسی نام یا مختلف نام سے [[Special:UserLogin|دوبارہ داخلِ نوشتہ]] بھی ہو سکتے ہیں۔  یہ یاد آوری کرلیجیۓ کہ کچھ صفحات ایسے نظر آتے رہیں گے کہ جیسے ابھی آپ خارج نہیں ہوئے ، جب تک آپ اپنے متصفح کا ابطن صاف نہ کردیں۔",
+آپ گمنام طور پر {{SITENAME}}  کا استعمال جاری رکھ سکتے ہیں، یا دوبارہ اسی نام یا مختلف نام سے <span class='plainlinks'>[$1 دوبارہ داخلِ نوشتہ]</span> بھی ہو سکتے ہیں۔  یہ یاد آوری کرلیجیۓ کہ کچھ صفحات ایسے نظر آتے رہیں گے کہ جیسے ابھی آپ خارج نہیں ہوئے ، جب تک آپ اپنے متصفح کا ابطن صاف نہ کردیں۔",
 'welcomecreation' => '== خوش آمدید، $1 ! ==
 آپ کا کھاتہ بنا دیا گیا ہے۔ اپنی [[Special:Preferences|{{SITENAME}} ترجیحات]] مرتب کرنا مت بھولئے گا.',
 'yourname' => 'اسمِ رکنیت',
@@ -790,8 +790,6 @@ $1",
 'search-interwiki-caption' => 'ساتھی منصوبے',
 'search-interwiki-default' => '$1 نتائج:',
 'search-interwiki-more' => '(مزید)',
-'search-mwsuggest-enabled' => 'بمع تجاویز',
-'search-mwsuggest-disabled' => 'تجاویز نہیں',
 'search-relatedarticle' => 'متعلقہ',
 'mwsuggest-disable' => 'AJAX تجاویز غیرفعال',
 'searchrelated' => 'متعلقہ',
@@ -1488,4 +1486,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:SpecialPages
 'specialpages' => 'خصوصی صفحات',
 
+# Search suggestions
+'searchsuggest-search' => 'تلاش',
+
 );
index eb09a3e..e1f0178 100644 (file)
@@ -61,6 +61,7 @@ $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',
@@ -177,7 +178,6 @@ $messages = array(
 'qbbrowse' => "Ko'rish",
 'qbedit' => 'Tahrirlash',
 'qbpageoptions' => 'Ushbu sahifa',
-'qbpageinfo' => "Sahifa haqida ma'lumot",
 'qbmyoptions' => 'Mening sahifalarim',
 'qbspecialpages' => 'Maxsus sahifalar',
 'faq' => 'TSS',
@@ -190,7 +190,7 @@ $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" tashqi ko\'rinishi uchun)',
+'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',
@@ -352,6 +352,9 @@ $messages = array(
 '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.',
@@ -409,7 +412,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',
@@ -498,8 +501,11 @@ 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!'''",
@@ -642,10 +648,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',
@@ -660,8 +666,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',
@@ -674,7 +678,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',
@@ -927,7 +931,7 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 '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 yuklash',
@@ -962,7 +966,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',
@@ -1032,7 +1036,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listgrouprights-members' => '(a’zolar ro‘yxati)',
 
 # E-mail user
-'emailuser' => 'Bu foydalanuvchiga e-maktub',
+'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:',
@@ -1043,7 +1049,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 '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.',
@@ -1365,6 +1373,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 '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',
@@ -1384,7 +1393,8 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 '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.',
@@ -1488,12 +1498,16 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 
 # 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..607c442 100644 (file)
@@ -294,7 +294,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,7 +547,7 @@ 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! ==
 
@@ -1139,8 +1138,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',
@@ -3378,4 +3375,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..362f233 100644 (file)
@@ -231,7 +231,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,7 +470,7 @@ 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.
@@ -954,8 +953,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š',
@@ -2282,7 +2279,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'",
@@ -3061,6 +3057,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..b3cd79d 100644 (file)
@@ -441,7 +441,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 +453,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ử',
@@ -701,7 +700,7 @@ 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.",
+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.",
 '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}}]].',
@@ -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',
@@ -2511,8 +2517,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]].",
@@ -2812,6 +2818,7 @@ 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',
@@ -2938,7 +2945,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 +3084,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' => 'Thông tin được hiển thị có thể chỉ có liên quan đến phiên bản hiện hành.',
 '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',
@@ -3103,10 +3110,10 @@ 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',
 
 # Skin names
 'skinname-standard' => 'Cổ điển',
@@ -3740,7 +3747,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
@@ -4077,6 +4085,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.',
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..cb66929 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,7 +473,7 @@ 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.
@@ -931,8 +930,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',
@@ -2822,4 +2819,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..89fda5b 100644 (file)
@@ -379,8 +379,6 @@ Mõnõd šabloonad eväd lee lizettü.",
 '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",
@@ -425,7 +423,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ä',
 
index a485807..d177635 100644 (file)
@@ -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,7 +422,7 @@ $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',
@@ -792,8 +791,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õ',
index adeb032..9b1c150 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,7 +422,7 @@ $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! ==
 
@@ -2361,6 +2360,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 1369b35..9395cbd 100644 (file)
@@ -209,7 +209,6 @@ $messages = array(
 'qbbrowse' => 'Igdalikyat',
 'qbedit' => 'Igliwat',
 'qbpageoptions' => 'Ini nga pakli',
-'qbpageinfo' => 'Kontexto',
 'qbmyoptions' => 'Akon mga pakli',
 'qbspecialpages' => 'Mga pinaurog nga pakli',
 'faq' => 'AGG',
@@ -328,6 +327,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]',
@@ -350,6 +353,8 @@ $1',
 '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',
@@ -409,10 +414,13 @@ Alayon la igsumat ini ha [[Special:ListUsers/sysop|administrator]], igsurat la a
 '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.',
@@ -424,11 +432,25 @@ An data dini diri mahihimo nga bag-o.',
 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:",
+'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".',
+'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-unknownscanner' => 'diri-nasasabtan nga antivirus:',
@@ -441,7 +463,9 @@ Ayaw paghingalimot hin pagbalyo han imo [[Special:Preferences|{{SITENAME}} mga g
 '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}}.",
@@ -463,7 +487,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.',
@@ -474,6 +504,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".',
@@ -481,9 +512,12 @@ 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}}',
+'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',
 
 # Change password dialog
@@ -493,6 +527,7 @@ Alayon pagutro pagbutang.',
 'newpassword' => 'Bag-o nga tigaman-pagsulod:',
 'retypenew' => 'Utroha pagbutang an bag-o nga tigaman-pagsulod:',
 '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:',
@@ -500,6 +535,7 @@ Alayon pagutro pagbutang.',
 # Special:PasswordReset
 '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
@@ -507,6 +543,14 @@ Temporaryo nga tigaman han pagsakob: $2',
 'passwordreset-emailsent' => 'Ginpadara hin usa ka pahinumdom nga e-mail.',
 
 # 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
@@ -566,6 +610,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)',
@@ -596,6 +641,13 @@ 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 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.
@@ -636,7 +688,11 @@ 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',
 'revdelete-show-file-confirm' => 'Sigurado ka nga gusto mo makita an ginpara nga pagliwat han file "<nowiki>$1</nowiki>" tikang $2 ha $3?',
@@ -648,6 +704,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',
@@ -702,8 +764,7 @@ 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-relatedarticle' => 'kasumapy',
 'searchrelated' => 'kadugtong',
 'searchall' => 'ngatanan',
 'showingresultsheader' => "{{PLURAL:$5|Resulta '''$1''' han '''$3'''|Mga resulta '''$1 - $2''' han '''$3'''}} para ha '''$4'''",
@@ -711,11 +772,16 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 'powersearch' => 'Abansado nga pagbiling',
 'powersearch-legend' => 'Abansado nga pagbiling',
 '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',
@@ -735,7 +801,12 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 'prefs-rc' => 'Kalalabay la nga mga pagbabag-o',
 'prefs-watchlist-days' => 'Mga adlaw nga makikita ha barantayan:',
 'prefs-resetpass' => 'Igliwan an tigaman-pagsulod',
+'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',
@@ -743,6 +814,8 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 'savedprefs' => 'Gintipig an im karuyag.',
 'timezonelegend' => 'Zona hin oras',
 'localtime' => 'Oras nga lokal',
+'servertime' => 'Oras han serbidor:',
+'guesstimezone' => 'Butanga tikang han panngaykay(browser)',
 'timezoneregion-africa' => 'Aprika',
 'timezoneregion-america' => 'Amerika',
 'timezoneregion-antarctica' => 'Antarktika',
@@ -753,16 +826,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',
@@ -771,16 +850,38 @@ 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-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-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 '''[[Gumaramit:$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',
@@ -790,9 +891,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
@@ -800,11 +904,24 @@ 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',
 
 # User rights log
 'rightsnone' => '(waray)',
@@ -815,6 +932,9 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'action-createpage' => 'pahimo hin mga pakli',
 'action-minoredit' => 'butanga hin tigaman hinin nga pagliwat komo gutiay',
 'action-move' => 'balhina ini nga pakli',
+'action-movefile' => 'igbalhin ini nga paypay',
+'action-upload' => 'igkarga-pasaka ini nga paypay',
+'action-reupload' => 'igsapaw ini nga aanhi nga paypay',
 'action-delete' => 'paraa ini nga pakli',
 'action-deleterevision' => 'igpara ini nga pagbag-o',
 
@@ -863,6 +983,7 @@ Mga pakli ha [[Special:Watchlist|imo angay timan-an]] in naka-'''bold'''.",
 # Upload
 'upload' => 'Pagkarga hin file',
 'uploadbtn' => 'Igkarga an file',
+'uploadnologin' => 'Diri nakalog-in',
 '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:",
@@ -877,15 +998,52 @@ An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para ha
 'illegal-filename' => 'An ngaran han fayl in diri gintutugutan.',
 'unknown-error' => 'Nahitabo an waray kasasabti nga sayop.',
 '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',
 
+# File backend
+'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 "$".',
+'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',
 
@@ -1152,7 +1310,11 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 'restriction-move' => 'Balhina',
 'restriction-create' => 'Himo-a',
 
+# 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:',
@@ -1207,6 +1369,8 @@ 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',
+'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
@@ -1221,7 +1385,12 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 'ipbotherreason' => 'Lain/dugang nga katadungan:',
 'blockipsuccesssub' => 'Malinamposon an pagpugong',
 'ipblocklist' => 'Mga ginpugngan nga gumaramit',
+'blocklist-target' => 'Gin-iigo',
+'blocklist-expiry' => 'Napan-os',
+'blocklist-by' => 'Ginpupugngan an admin',
+'blocklist-reason' => 'Rason:',
 'ipblocklist-submit' => 'Bilnga',
+'ipblocklist-localblock' => 'Lokal nga pagpugong',
 'blocklink' => 'igpugong',
 'unblocklink' => 'igtanggal an pagpugong',
 'change-blocklink' => 'igliwan an papugong',
@@ -1229,6 +1398,7 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 'blocklogpage' => 'Talaan han pagpugong',
 'blocklogentry' => 'ginpugngan hi [[$1]] nga natatapos ha takna hin $2 $3',
 'block-log-flags-nocreate' => 'diri gintutugutan an paghimo hin akawnt',
+'blockme' => 'Pugngi ako',
 'proxyblocksuccess' => 'Human na.',
 
 # Developer tools
@@ -1236,6 +1406,7 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 
 # 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.",
 'newtitle' => 'Para ha bag-o nga titulo:',
@@ -1253,6 +1424,7 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 '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',
 
 # Namespace 8 related
 'allmessagesname' => 'Ngaran',
@@ -1268,7 +1440,9 @@ 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-upload-filename' => 'Ngaran han paypay:',
 'import-comment' => 'Komento:',
+'importnopages' => 'Waray pakli nga ginpapaangbit.',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'An imo pakli hin gumaramit',
@@ -1333,6 +1507,28 @@ Makikit-an nimo an ginkuhaaan',
 
 # Attribution
 'othercontribs' => 'Ginbasihan ha binuhat ni $1.',
+'others' => 'mga iba',
+'siteusers' => '{{SITENAME}} {{PLURAL:$2|gumaramit|mga gumaramit}} $1',
+
+# Info page
+'pageinfo-header-basic' => 'Panguna nga pananabotan',
+'pageinfo-header-edits' => 'Kaagi han pagliwat',
+'pageinfo-header-restrictions' => 'Panalipod han pakli',
+'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',
 
 # Browsing diffs
 'previousdiff' => '← Durudaan nga pagliwat',
@@ -1344,6 +1540,7 @@ Makikit-an nimo an ginkuhaaan',
 '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-size' => '$1 × $2 nga mga pixel',
 
 # Special:NewFiles
 'newimages-legend' => 'Panara',
@@ -1389,22 +1586,35 @@ An iba in daan nakatago.
 'exif-sharpness' => 'Pagkatarom',
 'exif-gpstimestamp' => 'GPS nga oras (atomiko nga relo)',
 'exif-gpsspeedref' => 'Sukol han kalaksi',
+'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-cameraownername' => 'Tag-iya han kamera',
 
 'exif-exposureprogram-1' => 'Mano-mano',
 
 'exif-subjectdistance-value' => '$1 ka mga metro',
 
+'exif-meteringmode-0' => 'Waray kasabti',
+
 '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-1' => 'Mahumok',
 'exif-contrast-2' => 'Matig-a',
 
@@ -1418,6 +1628,14 @@ An iba in daan nakatago.
 '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',
 
@@ -1505,22 +1723,31 @@ An iba in daan nakatago.
 
 # Special:Version
 'version' => 'Bersyon',
+'version-skins' => 'Mga panit',
 'version-version' => '(Bersion $1)',
 'version-license' => 'Lisensya',
 'version-software-product' => 'Produkto',
 'version-software-version' => 'Bersyon',
 
 # Special:FilePath
+'filepath' => 'Aragian han paypay',
 'filepath-page' => 'Paypay:',
 'filepath-submit' => 'Kadto-a',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Pamilnga',
-'fileduplicatesearch-noresults' => 'Waray nabilngan nga paypay nga an ngaran "$".',
+'fileduplicatesearch-noresults' => 'Waray nabilngan nga paypay nga an ngaran in "$".',
 
 # Special:SpecialPages
 'specialpages' => 'Mga 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',
@@ -1559,9 +1786,48 @@ An iba in daan nakatago.
 'htmlform-selectorother-other' => 'iba',
 
 # New logging system
+'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-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-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-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..a5daefc 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,7 +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.",
+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.",
 'welcomecreation' => '== Dalal-jàmm, $1 ! ==
 Sosees na sa sàq.
 Bul fatte soppi say [[Special:Preferences|{{SITENAME}} tànneef]].',
@@ -907,8 +906,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',
index a9d7dd5..0b31e31 100644 (file)
@@ -382,7 +382,7 @@ $2',
 # Login and logout pages
 'logouttext' => "侬已经登出哉。'''
 
-侬可以继续匿名使用{{SITENAME}} ,也可以再次以相同或者两样个用户名[[Special:UserLogin|登录]]
+侬可以继续匿名使用{{SITENAME}} ,也可以再次以相同或者两样个用户名<span class='plainlinks'>[$1 登录]</span>
 注意,有眼页面作兴还是会搭侬登出前头一样显示,一脚到侬清除浏览器缓存。",
 'welcomecreation' => '== 欢迎侬, $1! ==
 
@@ -884,8 +884,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' => '垃拉所有名字空间里向搜索',
index 8f77bc5..c5ef036 100644 (file)
@@ -397,7 +397,7 @@ $1',
 # Login and logout pages
 'logouttext' => "'''Та һарад бәәнәт.'''
 
-Та {{SITENAME}} гидг ормиг нертә уга олзлҗ чаднат, аль та [[Special:UserLogin|дәкәд орҗ]] цацу аль талдан нертә чаднат.
+Та {{SITENAME}} гидг ормиг нертә уга олзлҗ чаднат, аль та <span class='plainlinks'>[$1 дәкәд орҗ]</span> цацу аль талдан нертә чаднат.
 Зәрм халхс цааранднь та ода чигн орсн мет үзүлҗ чаддг тускар темдглтн (та хәләчин санлиг цеврлтл).",
 'welcomecreation' => '== Ирхитн эрҗәнәвидн, $1! ==
 Таднар шин бичгдлһн бүтв.
@@ -596,8 +596,6 @@ $1',
 'search-interwiki-caption' => 'Садта проектмуд',
 'search-interwiki-default' => '$1 ашуд:',
 'search-interwiki-more' => '(дәкәд)',
-'search-mwsuggest-enabled' => 'селвгтә',
-'search-mwsuggest-disabled' => 'селвг уга',
 'mwsuggest-disable' => 'AJAX селвг унтрах',
 'searcheverything-enable' => 'Цуг нернә ууд хәәх',
 'searchall' => 'цуг',
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..ae6ff8e 100644 (file)
@@ -431,8 +431,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 +923,7 @@ $messages = array(
 # Special:Tags
 'tag-filter' => '[[Special:Tags|ხინტკეფიშ]] ტკიბირი:',
 
+# Search suggestions
+'searchsuggest-search' => 'გორუა',
+
 );
index c8f6948..3989be2 100644 (file)
@@ -328,7 +328,6 @@ $messages = array(
 'qbbrowse' => 'בלעטערט',
 'qbedit' => 'ענדערן',
 'qbpageoptions' => 'דער בלאט',
-'qbpageinfo' => 'קאנטעקסט',
 'qbmyoptions' => 'מיינע בלעטער',
 'qbspecialpages' => 'ספעציעלע בלעטער',
 'faq' => 'מערסטע געפרעגטע פראגעס',
@@ -341,7 +340,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' => 'ווײַזן היסטאָריע',
@@ -595,7 +594,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''איר האָט זיך ארויסלאָגירט.'''
 
-איר קענט ממשיך זיין ניצן {{SITENAME}} אַנאנים, אדער איר קענט  [[Special:UserLogin|צוריק אריינלאגירן]] מיט דעם זעלבן אדער אן אנדער באַניצער נאָמען. באמערקט אז געוויסע בלעטער קענען זיך ווייטער ארויסשטעלן אזוי ווי ווען איר זענט אריינלאגירט, ביז איר וועט אויסליידיגן דעם בלעטערער זאפאס.",
+איר קענט ממשיך זיין ניצן {{SITENAME}} אַנאנים, אדער איר קענט  <span class='plainlinks'>[$1 צוריק אריינלאגירן]</span> מיט דעם זעלבן אדער אן אנדער באַניצער נאָמען. באמערקט אז געוויסע בלעטער קענען זיך ווייטער ארויסשטעלן אזוי ווי ווען איר זענט אריינלאגירט, ביז איר וועט אויסליידיגן דעם בלעטערער זאפאס.",
 'welcomecreation' => '== ברוך הבא, $1! ==
 אייער קאנטע איז באשאפן געווארן. נישט פארגעסן צו ענדערן אייערע [[Special:Preferences|{{SITENAME}} פרעפֿערענצן]].',
 'yourname' => 'באַניצער נאָמען:',
@@ -969,6 +968,7 @@ $2
 'edit-already-exists' => 'נישט מעגליך צו שאַפֿן נייע בלאט.
 ער עקזיסטירט שוין.',
 'defaultmessagetext' => 'גרונטלעכער מעלדונג טעקסט',
+'invalid-content-data' => 'אומגילטיקע אינהאלט דאטן',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''אזהרה:''' דער בלאט אנטהאלט צופיל טייערע פארזירער רופן.
@@ -1211,8 +1211,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 +1422,7 @@ $1",
 'right-upload' => 'ארויפלאדן טעקעס',
 'right-reupload' => 'איבערשרײַבן עקסיסטירנדע טעקע',
 'right-reupload-own' => "איבערשרײַבן עקזיסטירנדע טעקעס וואָס מ'האט אַליין אַרויפֿגעלאָדן",
+'right-reupload-shared' => 'אריבערשרייבן טעקעס אויפן געמיינזאם מעדיע רעפאזיטאריום',
 'right-upload_by_url' => 'ארויפֿלאָדן טעקעס פֿון אַ URL',
 'right-purge' => 'ליידיקן דעם זייטל־זאפאס פאר א בלאט אן באשטעטיקונג',
 'right-autoconfirmed' => 'רעדאקטירן האלב-געשיצטע בלעטער',
@@ -1601,6 +1600,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 +1608,8 @@ $1",
 'file-too-large' => 'די טעקע וואָס איר האט אײַנגעגעבן איז צו גרויס.',
 'filename-tooshort' => 'דער טעקענאמען איז צו קורץ',
 'filetype-banned' => 'דער טיפ טעקע איז געאַסרט',
+'verification-error' => 'די טעקע איז נישט אדורכגעגאנגען טעקע פרואוואונג.',
+'hookaborted' => 'די מאדיפיצירונג איר האט פרובירט קען נישט ווערן דורכגעפירט צוליב א פארברייטערונג.',
 'illegal-filename' => 'דער טעקע־נאָמען איז נישט ערלויבט',
 'overwrite' => 'מען טאָר נישט איבערשרײַבן אַן עקזיסטירנדע טעקע.',
 'unknown-error' => 'אַן אומבאַקאַנט טעות איז פֿארגעקומען.',
@@ -1626,6 +1628,9 @@ $1",
 * נאמען פון דער טעקע וואס ווערט ארויפגעלאָדן: <strong>[[:$1]]</strong>
 * נאמען פון דער פֿאראנענער טעקע: <strong>[[:$2]]</strong>
 זײַט אזוי גוט און קלויבט אן אנדער נאמען.',
+'file-thumbnail-no' => "דער טעקע־נאמען הייבט אן מיט <strong>$1</strong>.
+זי זעט אויס ווי א פארקלענערט בילד ''(מיניאטור)''.
+טאמער האט איר דאס בילד אין פולער רעזאלוציע טוט עס ארויפלאדן, אנדערשט זייט אזוי גוט און ענדערט דעם טעקע־נאמען.",
 'fileexists-forbidden' => 'א טעקע מיט דעם נאָמען עקזיסטירט שוין, און מען קען זי נישט אַריבערשרײַבן. 
 אויב איר ווילט דאך אַרויפֿלאָדן אײַער טעקע, ביטע גיין צוריק און ניצן אַן אַנדער נאָמען. 
 [[File:$1|thumb|center|$1]]',
@@ -1737,6 +1742,7 @@ $1",
 'license-header' => 'ליצענץ:',
 'nolicense' => 'גארנישט',
 'license-nopreview' => '(פֿאראויסקוק נישט פֿאַראַן)',
+'upload_source_url' => ' (א גילטיקע , צוגעגנלעכער URL)',
 'upload_source_file' => '(א טעקע אויף אײַער קאמפיוטער)',
 
 # Special:ListFiles
@@ -1798,6 +1804,7 @@ $1",
 'filerevert-defaultcomment' => 'צוריקגעשטעלט צו דער ווערסיע פֿון $2, $1',
 'filerevert-submit' => 'צוריקדרייען',
 'filerevert-success' => "'''[[Media:$1|$1]]''' צוריקגשטעלט צו דער [$4 ווערסיע פֿון $3, $2].",
+'filerevert-badversion' => 'נישט פאראן קיין פריערדיקע לאקאלע ווערסיע פון דער טעקע מיטן געזוכטן צייטשטעמפל.',
 
 # File deletion
 'filedelete' => 'מעק אויס $1',
@@ -2316,7 +2323,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 +2332,7 @@ $UNWATCHURL
 'undelete-search-box' => 'זוכן אויסגעמעקטע בלעטער',
 'undelete-search-prefix' => 'ווײַז בלעטער וואס הייבן אן מיט:',
 'undelete-search-submit' => 'זוכן',
+'undelete-no-results' => 'נישט געטראפן קיין צוגעפאסטע בלעטער אין אויסמעקונג ארכיוו.',
 'undelete-error' => 'גרייז ביים צוריקשטעלן בלאט',
 'undelete-error-short' => 'טעות ביים צוריקשטעלן טעקע: $1',
 'undelete-error-long' => 'גרײַזן געטראפֿן בײַם ווידערשטעלן די טעקע:
@@ -2338,6 +2346,7 @@ $1',
 'namespace' => 'נאמענטייל:',
 'invert' => 'ווײַז אַלע אויסער די',
 'namespace_association' => 'אָנגעבונדענער נאָמענטייל',
+'tooltip-namespace_association' => 'צייכנט דאס קעסטל כדי איינשליסן דעם שמועס אדער סוביעקט נאמענטייל וואס געהערט צום אויסגעקליבענעם נאמענטייל',
 'blanknamespace' => '(הויפט)',
 
 # Contributions
@@ -2620,6 +2629,10 @@ $1',
 'imageinvalidfilename' => 'דער ציל טעקע נאָמען איז נישט גילטיק.',
 'fix-double-redirects' => 'דערהײַנטיקן ווײַטערפֿירונגען צום ארגינעלן טיטל',
 'move-leave-redirect' => 'איבערלאזן א ווײַטערפֿירונג',
+'move-over-sharedrepo' => '== טעקע עקזיסטירט ==
+[[:$1]] עקזיסטירט אויף א געטיילטן רעפאזיטאריום. ווען מען באוועגט א טעקע צו דעם טיטל וועט דאס איבערשרייבן די געטיילטע טעקע.',
+'file-exists-sharedrepo' => "ס'איז שוין פאראן א טעקע מיטן געקליבענעם נאמען אויף א געמיינזאם רעפאזיטאריום.
+זייט אזוי גוט קלייבט אן אנדער נאמען.",
 
 # Export
 'export' => 'עקספארטירן בלעטער',
@@ -2688,6 +2701,7 @@ $1',
 'import-interwiki-templates' => 'איינשילסן אלע מוסטערן',
 'import-interwiki-submit' => 'אימפארט',
 'import-interwiki-namespace' => 'ציל נאמענטייל:',
+'import-interwiki-rootpage' => 'ציל שטאמבלאט (אפציאנאל):',
 'import-upload-filename' => 'טעקע נאמען:',
 'import-comment' => 'הערה:',
 'importtext' => 'ביטע עקספארטירט די טעקע פון דער מקור וויקי ניצנדיג דאס [[Special:Export|עקספארט הילפמיטל]], שפייכלט אײַן אויף אײַער קאמפיוטער און לאדט אַרויף דא.',
@@ -2723,6 +2737,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,7 +2751,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript טעסט',
-'javascripttest-disabled' => 'די  פֿונקציע איז אומאַקטיווירט אין דער דאזיקער וויקי.',
 'javascripttest-title' => 'דורכפירנדיק $1 בדיקות',
 'javascripttest-pagetext-skins' => 'קלויבט א באניצער־אייבערפלאך מיט וואס דורכצופירן די בדיקות:',
 'javascripttest-qunit-intro' => 'זעט [$1 דאקומענטאציע פאר טעסטן] בײַ mediawiki.org.',
@@ -2868,7 +2884,6 @@ $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)',
@@ -3058,6 +3073,7 @@ $1',
 'exif-saturation' => 'זעטיקונג',
 'exif-sharpness' => 'שארף',
 'exif-devicesettingdescription' => 'אפאראט שטעלונגען אראפמאלונג',
+'exif-imageuniqueid' => 'בילד־ID',
 'exif-gpslatituderef' => 'צפון אדער דרום גארטל־ליניע',
 'exif-gpslatitude' => 'גארטל־ליניע',
 'exif-gpslongituderef' => 'מזרח אדער מערב לענג',
@@ -3087,6 +3103,7 @@ $1',
 'exif-keywords' => 'שליסלווערטער',
 'exif-worldregioncreated' => "וועלטראיאן וואו מ'האט גענומען דאס בילד",
 'exif-countrycreated' => "לאנד וואו מ'האט געמאכט דאס בילד",
+'exif-countrycodecreated' => "קאד פארן לאנד וואו מ'האט געמאכט דאס בילד",
 'exif-provinceorstatecreated' => "פראווינץ אדער שטאַט וואו מ'האט גענומען דאס בילד",
 'exif-citycreated' => "שטאָט וואו מ'האט געמאכט דאס בילד",
 'exif-worldregiondest' => 'וועלטראיאן געוויזן',
@@ -3117,6 +3134,7 @@ $1',
 'exif-cameraownername' => 'אייגנטימער פון קאמערע',
 'exif-label' => 'צעטל',
 'exif-datetimemetadata' => 'דאטע ווען מעטאדאטן זענען געווען לעצט געענדערט',
+'exif-nickname' => 'אויספארמעלער נאמען פון בילד',
 'exif-rating' => 'שאצונג (פֿון 5)',
 'exif-rightscertificate' => 'רעכטן פארוואלטונג צערטיפיקאט',
 'exif-copyrighted' => 'קאפירעכט סטאַטוס',
@@ -3133,6 +3151,9 @@ $1',
 # EXIF attributes
 'exif-compression-1' => 'אומ-צאמגעקוועטשט',
 
+'exif-copyrighted-true' => 'געשיצט מיט קאפירעכט',
+'exif-copyrighted-false' => 'פובליקער געביט',
+
 'exif-unknowndate' => 'אומבאַוואוסטע דאַטע',
 
 'exif-orientation-1' => 'נארמאַל',
@@ -3641,6 +3662,10 @@ $5
 'feedback-bugcheck' => 'געוואלדיק! אבער זייט בודק אז עס איז נישט איינער פון די [$1 באוואוסטע באגן].',
 'feedback-bugnew' => "כ'האב בודק געווען. רעפארטירט א נייעם באג.",
 
+# Search suggestions
+'searchsuggest-search' => 'זוכן',
+'searchsuggest-containing' => 'כולל…',
+
 # API errors
 'api-error-badaccess-groups' => 'איר האט נישט קיין רעכטן אַרויפֿלאָדן טעקעס אויף דער וויקי.',
 'api-error-badtoken' => 'אינערלעכער גרײַז: סימן טויג נישט.',
index de1cf47..925b787 100644 (file)
@@ -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,7 +447,7 @@ 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! ==
 
@@ -1062,8 +1061,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è:',
@@ -2992,6 +2989,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..528bbbe 100644 (file)
@@ -375,7 +375,6 @@ $messages = array(
 'qbbrowse' => '瀏覽',
 'qbedit' => '編輯',
 'qbpageoptions' => '呢一頁',
-'qbpageinfo' => '附近文字',
 'qbmyoptions' => '我嘅選項',
 'qbspecialpages' => '特別頁',
 'faq' => 'FAQ',
@@ -613,7 +612,7 @@ $1',
 # Login and logout pages
 'logouttext' => "'''你而家已經登出咗。'''
 
-你重可以用匿名身份用{{SITENAME}},又或者[[Special:UserLogin|重新登入]]
+你重可以用匿名身份用{{SITENAME}},又或者<span class='plainlinks'>[$1 重新登入]</span>
 但係留意某啲頁面可能會繼續話你未登入,除非等你清除瀏覽器嘅快取儲存。",
 'welcomecreation' => '== 歡迎, $1! ==
 
@@ -1147,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' => '搵全部空間名',
@@ -3376,4 +3373,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..580ffdd 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)',
index d9047ca..024a446 100644 (file)
@@ -423,7 +423,6 @@ $messages = array(
 'qbbrowse' => '浏览',
 'qbedit' => '编辑',
 'qbpageoptions' => '页面选项',
-'qbpageinfo' => '页面信息',
 'qbmyoptions' => '我的选项',
 'qbspecialpages' => '特殊页面',
 'faq' => '常见问题',
@@ -436,7 +435,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' => '查看历史',
@@ -681,7 +680,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''您现在已经退出。'''
 
-您可以继续以匿名方式使用{{SITENAME}},或再次以相同或不同用户身份[[Special:UserLogin|登录]]。请注意一些页面可能仍然显示您为登录状态,直到您清空您的浏览器缓存为止。",
+您可以继续以匿名方式使用{{SITENAME}},或再次以相同或不同用户身份<span class='plainlinks'>[$1 登录]</span>。请注意一些页面可能仍然显示您为登录状态,直到您清空您的浏览器缓存为止。",
 'welcomecreation' => '== 欢迎,$1! ==
 你的账户已创建。请别忘记更改你的[[Special:Preferences|{{SITENAME}}系统设置]]。',
 'yourname' => '用户名:',
@@ -1239,8 +1238,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' => '在所有名字空间中搜索',
@@ -1864,7 +1861,7 @@ $1',
 'shared-repo-from' => '出自$1',
 'shared-repo' => '一个共用文件库',
 'shared-repo-name-wikimediacommons' => '维基共享资源',
-'upload-disallowed-here' => '您不可以覆盖此图像',
+'upload-disallowed-here' => '您不可以覆盖此文件。',
 
 # File reversion
 'filerevert' => '恢复$1',
@@ -2806,7 +2803,6 @@ $1被封禁的理由是:“$2”',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript测试',
-'javascripttest-disabled' => '该wiki站点上尚未启用此功能。',
 'javascripttest-title' => '运行$1测试',
 'javascripttest-pagetext-noframework' => '此页面被保留用于运行JavaScript测试。',
 'javascripttest-pagetext-unknownframework' => '未知的框架“$1”。',
@@ -2941,7 +2937,7 @@ $1被封禁的理由是:“$2”',
 'spam_deleting' => '正在删除所有包含至$1的版本',
 
 # Info page
-'pageinfo-title' => '"$1" 的信息',
+'pageinfo-title' => '“$1”的信息',
 'pageinfo-header-basic' => '基本信息',
 'pageinfo-header-edits' => '编辑历史',
 'pageinfo-header-restrictions' => '页面保护',
@@ -2953,7 +2949,7 @@ $1被封禁的理由是:“$2”',
 'pageinfo-robot-policy' => '搜索引擎状态',
 'pageinfo-robot-index' => '可索引',
 'pageinfo-robot-noindex' => '不可索引',
-'pageinfo-views' => '视图的数量',
+'pageinfo-views' => '查看次数',
 'pageinfo-watchers' => '页面监视者人数',
 'pageinfo-redirects-name' => '重定向到本页',
 'pageinfo-subpages-name' => '本页的子页面',
@@ -2964,9 +2960,8 @@ $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' => '魔术字 ($1)',
 'pageinfo-hidden-categories' => '隐藏分类 ($1)',
 'pageinfo-templates' => '使用的模板 ($1)',
@@ -3841,6 +3836,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' => '内部错误:会话无效。',
index 924b1bb..96b2b32 100644 (file)
@@ -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' => '檢視歷史',
@@ -615,10 +614,10 @@ $2',
 'virus-unknownscanner' => '未知的防病毒:',
 
 # Login and logout pages
-'logouttext' => '您已經登出。
+'logouttext' => "您已經登出。
 
-您可以以匿名方式繼續使用{{SITENAME}},或以相同或不同用戶身份[[Special:UserLogin|登入]]
-請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器緩存。',
+您可以以匿名方式繼續使用{{SITENAME}},或以相同或不同用戶身份<span class='plainlinks'>[$1 登入]</span>
+請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器緩存。",
 'welcomecreation' => '== 歡迎,$1! ==
 您的賬號已經建立。
 不要忘記設置[[Special:Preferences|{{SITENAME}}的個人參數]]。',
@@ -965,6 +964,14 @@ $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-text' => '純文字',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => '警告: 這個頁面有太多耗費的語法功能呼叫。
@@ -1203,8 +1210,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,7 +1842,7 @@ $1',
 'shared-repo-from' => '出自$1',
 'shared-repo' => '一個共用檔案庫',
 'shared-repo-name-wikimediacommons' => '維基共享資源',
-'upload-disallowed-here' => '您不可以覆蓋此圖像。',
+'upload-disallowed-here' => '您不可以覆蓋此檔案。',
 
 # File reversion
 'filerevert' => '恢復$1',
@@ -2382,7 +2387,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' => '搜索已刪除頁面',
@@ -2685,6 +2690,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 +2816,6 @@ $1被封禁的理由是“$2”',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript測試',
-'javascripttest-disabled' => '此功能在此Wiki上未被使用。',
 'javascripttest-title' => '運行$1測試。',
 'javascripttest-pagetext-noframework' => '這個頁面預留了作JavaScript測試。',
 'javascripttest-pagetext-unknownframework' => '未知框架"$1"',
@@ -2945,7 +2950,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' => '保護頁面',
@@ -2970,10 +2976,14 @@ $1被封禁的理由是“$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 )',
+'pageinfo-toolboxlink' => '頁面資訊',
+'pageinfo-redirectsto' => '重定向到',
+'pageinfo-redirectsto-info' => '資訊',
+'pageinfo-contentpage' => '計算為內容頁',
+'pageinfo-contentpage-yes' => '是',
 
 # Skin names
 'skinname-standard' => '標準',
@@ -3569,6 +3579,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[跨wiki轉換代碼不可用]',
 'scarytranscludefailed' => '[模板$1讀取失敗]',
+'scarytranscludefailed-httpstatus' => '[模板$1讀取失敗:HTTP$2]',
 'scarytranscludetoolong' => '[URL 地址太長]',
 
 # Delete conflict
@@ -3844,6 +3855,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' => '內部錯誤:標記無效。',
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 1056ece..be2b8c3 100644 (file)
@@ -81,6 +81,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 ) {
index c00d7a6..ea649a6 100644 (file)
@@ -1136,7 +1136,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" );
                }
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;
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 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));
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);
+
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;
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;
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 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();
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" );
                                }
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 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() ), '' ) );
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 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 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)
old mode 100755 (executable)
new mode 100644 (file)
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 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 b644d8e..60e0f30 100644 (file)
@@ -178,7 +178,6 @@ $wgMessageStructure = array(
                'qbbrowse',
                'qbedit',
                'qbpageoptions',
-               'qbpageinfo',
                'qbmyoptions',
                'qbspecialpages',
                'faq',
@@ -689,6 +688,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 +918,6 @@ $wgMessageStructure = array(
                'search-interwiki-default',
                'search-interwiki-custom',
                'search-interwiki-more',
-               'search-mwsuggest-enabled',
-               'search-mwsuggest-disabled',
                'search-relatedarticle',
                'mwsuggest-disable',
                'searcheverything-enable',
@@ -2337,6 +2343,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 +2460,6 @@ $wgMessageStructure = array(
        'javaccripttest' => array(
                'javascripttest',
                'javascripttest-backlink',
-               'javascripttest-disabled',
                'javascripttest-title',
                'javascripttest-pagetext-noframework',
                'javascripttest-pagetext-unknownframework',
@@ -2666,6 +2672,7 @@ $wgMessageStructure = array(
        'info' => array(
                'pageinfo-header',
                'pageinfo-title',
+               'pageinfo-not-current',
                'pageinfo-header-basic',
                'pageinfo-header-edits',
                'pageinfo-header-restrictions',
@@ -2691,11 +2698,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',
@@ -3345,6 +3359,7 @@ $wgMessageStructure = array(
        'scarytransclusion' => array(
                'scarytranscludedisabled',
                'scarytranscludefailed',
+               'scarytranscludefailed-httpstatus',
                'scarytranscludetoolong',
        ),
        'deleteconflict' => array(
@@ -3738,6 +3753,10 @@ $wgMessageStructure = array(
                'feedback-bugcheck',
                'feedback-bugnew',
        ),
+       'searchsuggestions' => array(
+               'searchsuggest-search',
+               'searchsuggest-containing',
+       ),
        'apierrors' => array(
                'api-error-badaccess-groups',
                'api-error-badtoken',
@@ -3827,6 +3846,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 +4047,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..c591665 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() {
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-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 3f9b376..d0712e3 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);
diff --git a/maintenance/populateFilearchiveSha1.php b/maintenance/populateFilearchiveSha1.php
new file mode 100644 (file)
index 0000000..e9baef9
--- /dev/null
@@ -0,0 +1,97 @@
+<?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' );
+               $this->output( "Populating fa_sha1 field from fa_storage_key\n" );
+               $endId = $dbw->selectField( $table, 'MAX(fa_id)', false, __METHOD__ );\r
+
+               $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 ) {
+                               $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..07c395f 100644 (file)
@@ -74,16 +74,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..382b7be 100644 (file)
@@ -143,14 +143,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 +174,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.
index 1e3eecb..8c91f29 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);
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 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 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" );
index 3d9270b..535808d 100644 (file)
@@ -216,18 +216,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..ad9a380 100644 (file)
@@ -100,10 +100,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..80a2278 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 out if we hit the job count or wall time limits...
+                               if ( $maxJobs && ++$n >= $maxJobs ) {
                                        break 2;
                                }
-                               if ( $maxTime && time() - $startTime > $maxTime ) {
+                               if ( $maxTime && ( time() - $startTime ) > $maxTime ) {
                                        break 2;
                                }
+                               // Don't let any slaves/backups fall behind...
+                               $group->get( $type )->waitForBackups();
                        }
-               }
+               } while ( $job ); // stop when there are no jobs
        }
 
        /**
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-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-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
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;
old mode 100755 (executable)
new mode 100644 (file)
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 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 f66ef06..197151b 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);
@@ -843,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));
 
 
 --
@@ -881,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));
 
 
 --
@@ -929,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
@@ -940,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));
 
 
 --
@@ -1268,9 +1289,23 @@ 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 concurrent job acquisition
+  job_random 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 ON /*_*/job (job_cmd, job_namespace, job_title, job_params(128));
 CREATE INDEX /*i*/job_timestamp ON /*_*/job (job_timestamp);
 
@@ -1482,4 +1517,69 @@ CREATE TABLE /*_*/config (
 -- Should cover *most* configuration - strings, ints, bools, etc.
 CREATE INDEX /*i*/cf_name_value ON /*_*/config (cf_name,cf_value(255));
 
+-- 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*/;
+
+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..e3c993b 100644 (file)
@@ -126,12 +126,18 @@ class UpdateMediaWiki extends Maintenance {
                $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 );
+                       }
                }
 
                $this->output( "\nDone.\n" );
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 e1b7659..afa9bb2 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 */
@@ -159,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',
@@ -527,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',
@@ -602,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',
        ),
@@ -615,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',
@@ -902,13 +948,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.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 484651e..75dc2b9 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;
+                                       prevSafeVal = res.newVal;
                                }
-                       });
-               });
+                       } );
+               } );
        };
 }( jQuery ) );
diff --git a/resources/jquery/jquery.hidpi.js b/resources/jquery/jquery.hidpi.js
new file mode 100644 (file)
index 0000000..b7335ff
--- /dev/null
@@ -0,0 +1,119 @@
+/**
+ * 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 ) {
+                               // Too big, skip!
+                       } else if ( ratio > selectedRatio ) {
+                               selectedRatio = ratio;
+                               selectedSrc = src;
+                       }
+               }
+       }
+       return selectedSrc;
+};
+
+}( jQuery ) );
index 0844da7..f720e07 100644 (file)
@@ -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..d4f3bb3 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery JavaScript Library v1.8.1
+ * jQuery JavaScript Library v1.8.2
  * 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: Thu Sep 20 2012 21:13:05 GMT-0400 (Eastern Daylight 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.2",
 
        // 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;
        },
@@ -1143,7 +1143,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 = {};
@@ -1262,7 +1262,7 @@ jQuery.support = (function() {
        a.style.cssText = "top:1px;float:left;opacity:.5";
 
        // Can't get basic test support
-       if ( !all || !all.length || !a ) {
+       if ( !all || !all.length ) {
                return {};
        }
 
@@ -1513,7 +1513,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 +1565,7 @@ jQuery.extend({
                        // Only DOM nodes need a new unique ID for each element since their data
                        // ends up in the global cache
                        if ( isNode ) {
-                               elem[ internalKey ] = id = jQuery.deletedIds.pop() || ++jQuery.uuid;
+                               elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
                        } else {
                                id = internalKey;
                        }
@@ -1739,7 +1739,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 +2049,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 +2082,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 +2136,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;
                        }
                }
@@ -2314,7 +2314,7 @@ jQuery.extend({
                                return ret;
 
                        } else {
-                               elem.setAttribute( name, "" + value );
+                               elem.setAttribute( name, value + "" );
                                return value;
                        }
 
@@ -2578,7 +2578,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 +2711,7 @@ jQuery.event = {
                                handler: handler,
                                guid: handler.guid,
                                selector: selector,
+                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
                                namespace: namespaces.join(".")
                        }, handleObjIn );
 
@@ -2946,7 +2947,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 +2995,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 +3024,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 );
@@ -3593,7 +3596,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 +3667,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 +3682,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
@@ -3741,7 +3758,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 +3787,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 +3872,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 +3887,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 +3938,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 +3965,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 +4021,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 +4049,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 +4078,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 +4138,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 +4173,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 +4203,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 +4215,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
@@ -4236,76 +4269,55 @@ Expr = Sizzle.selectors = {
                },\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 +4352,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 +4477,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
@@ -4476,51 +4516,48 @@ Expr = Sizzle.selectors = {
 \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( matchIndexes, length, argument ) {\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, argument ) {\r
+                       return [ length - 1 ];\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
+               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
+                       return [ argument < 0 ? argument + length : argument ];\r
+               }),\r
+\r
+               "even": createPositionalPseudo(function( matchIndexes, length, argument ) {\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, argument ) {\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
@@ -4642,24 +4679,17 @@ Sizzle.error = function( msg ) {
        throw new Error( "Syntax error, unrecognized expression: " + msg );\r
 };\r
 \r
-function tokenize( selector, context, xml, 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
+function tokenize( selector, parseOnly ) {\r
+       var matched, match, tokens, type, 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
@@ -4667,45 +4697,31 @@ function tokenize( selector, context, xml, parseOnly ) {
                if ( !matched || (match = rcomma.exec( soFar )) ) {\r
                        if ( match ) {\r
                                soFar = soFar.slice( match[0].length );\r
-                               tokens.selector = group;\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
+                               // The last two arguments here are (context, xml) for backCompat\r
+                               (match = preFilters[ type ]( match, document, true ))) ) {\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
+                               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 +4730,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 +4738,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 +4773,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 +4781,382 @@ 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
+               // Positional selectors apply to seed elements, so it is invalid to follow them with relative ones\r
+               if ( seed && postFinder ) {\r
+                       return;\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
+               var i, elem, postFilterIn,\r
+                       preMap = [],\r
+                       postMap = [],\r
+                       preexisting = results.length,\r
 \r
-       // Return a cached group function if already generated (context dependent)\r
-       if ( cached && cached.context === context ) {\r
-               return cached;\r
-       }\r
+                       // Get initial elements from seed or context\r
+                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [], seed ),\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
+                       // 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
-       // 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
+                       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
-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
+                                       // ...intermediate processing is necessary\r
+                                       [] :\r
 \r
-function handlePOSGroup( selector, posfilter, argument, contexts, seed, not ) {\r
-       var results,\r
-               fn = Expr.setFilters[ posfilter.toLowerCase() ];\r
+                                       // ...otherwise use results directly\r
+                                       results :\r
+                               matcherIn;\r
 \r
-       if ( !fn ) {\r
-               Sizzle.error( posfilter );\r
-       }\r
+               // Find primary matches\r
+               if ( matcher ) {\r
+                       matcher( matcherIn, matcherOut, context, xml );\r
+               }\r
 \r
-       if ( selector || !(results = seed) ) {\r
-               multipleContexts( selector || "*", contexts, (results = []), seed );\r
-       }\r
+               // Apply postFilter\r
+               if ( postFilter ) {\r
+                       postFilterIn = condense( matcherOut, postMap );\r
+                       postFilter( postFilterIn, [], context, xml );\r
 \r
-       return results.length > 0 ? fn( results, argument, not ) : [];\r
-}\r
+                       // Un-match failing elements by moving them back to matcherIn\r
+                       i = postFilterIn.length;\r
+                       while ( i-- ) {\r
+                               if ( (elem = postFilterIn[i]) ) {\r
+                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\r
+                               }\r
+                       }\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
+               // Keep seed and results synchronized\r
+               if ( seed ) {\r
+                       // Ignore postFinder because it can't coexist with seed\r
+                       i = preFilter && matcherOut.length;\r
+                       while ( i-- ) {\r
+                               if ( (elem = matcherOut[i]) ) {\r
+                                       seed[ preMap[i] ] = !(results[ preMap[i] ] = elem);\r
                                }\r
                        }\r
-               };\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
+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
        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
-                                               }\r
+               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {\r
+                       matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\r
+               } else {\r
+                       // The concatenated values are (context, xml) for backCompat\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
-                                               if ( (not = rendsWithNot.test( part )) ) {\r
-                                                       part = part.slice( 0, -5 ).replace( rcombinators, "$&*" );\r
-                                                       anchor++;\r
-                                               }\r
+       return elementMatcher( matchers );\r
+}\r
 \r
-                                               if ( match.length > 1 ) {\r
-                                                       match[0].replace( rposgroups, setUndefined );\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
+                       // 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
-                                               elements = handlePOSGroup( part, match[1], match[2], currentContexts, elements, not );\r
                                        }\r
-                                       part = "";\r
+                                       if ( outermost ) {\r
+                                               dirruns = dirrunsUnique;\r
+                                               cachedruns = ++superMatcher.el;\r
+                                       }\r
                                }\r
 \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
-                       if ( !matched ) {\r
-                               part += selector;\r
+                                       // Lengthen the array for every element, matched or not\r
+                                       if ( seed ) {\r
+                                               unmatched.push( elem );\r
+                                       }\r
+                               }\r
                        }\r
-                       matched = false;\r
-               }\r
 \r
-               if ( part ) {\r
-                       if ( rcombinators.test(part) ) {\r
-                               multipleContexts( part, elements || [ context ], results, seed );\r
-                       } else {\r
-                               Sizzle( part, context, results, seed ? seed.concat(elements) : elements );\r
-                       }\r
-               } else {\r
-                       push.apply( results, elements );\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
-       // Do not sort if this is a single filter\r
-       return len === 1 ? results : Sizzle.uniqueSort( results );\r
-}\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
+                                       }\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
+                                       // Discard index placeholder values to get only actual matches\r
+                                       setMatched = condense( setMatched );\r
+                               }\r
 \r
-       if ( seed ) {\r
-               elements = slice.call( seed, 0 );\r
+                               // Add matches to results\r
+                               push.apply( results, setMatched );\r
 \r
-       // To maintain document order, only narrow the\r
-       // set if there is one group\r
-       } else if ( match.length === 1 ) {\r
+                               // Seedless set matches succeeding multiple successful matchers stipulate sorting\r
+                               if ( outermost && !seed && setMatched.length > 0 &&\r
+                                       ( matchedCount + setMatchers.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
+                                       Sizzle.uniqueSort( results );\r
+                               }\r
+                       }\r
 \r
-                       context = Expr.find["ID"]( token.captures[0].replace( rbackslash, "" ), context, xml )[0];\r
-                       if ( !context ) {\r
-                               return results;\r
+                       // Override manipulation of globals by nested matchers\r
+                       if ( outermost ) {\r
+                               dirruns = dirrunsUnique;\r
+                               outermostContext = contextBackup;\r
                        }\r
 \r
-                       selector = selector.slice( tokens.shift().string.length );\r
-               }\r
+                       return unmatched;\r
+               };\r
+\r
+       superMatcher.el = 0;\r
+       return bySet ?\r
+               markFunction( superMatcher ) :\r
+               superMatcher;\r
+}\r
 \r
-               findContext = ( (match = rsibling.exec( tokens[0].string )) && !match.index && context.parentNode ) || context;\r
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\r
+       var i,\r
+               setMatchers = [],\r
+               elementMatchers = [],\r
+               cached = compilerCache[ expando ][ selector ];\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
+       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
+                               elementMatchers.push( cached );\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
 \r
-                                       if ( !selector ) {\r
-                                               push.apply( results, slice.call(elements, 0) );\r
-                                       }\r
+               // Cache the compiled function\r
+               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\r
+       }\r
+       return cached;\r
+};\r
 \r
-                                       break;\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
+       return results;\r
+}\r
+\r
+function select( selector, context, results, seed, xml ) {\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
+                               selector = selector.slice( tokens.shift().length );\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
+                       // 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
+                               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 +5166,16 @@ 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),\r
+                       // A support test would require too much code (would include document ready)\r
+                       rbuggyQSA = [":focus"],\r
+\r
+                       // matchesSelector(:focus) reports false when true (Chrome 21),\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", ":focus" ],\r
                        matches = docElem.matchesSelector ||\r
                                docElem.mozMatchesSelector ||\r
                                docElem.webkitMatchesSelector ||\r
@@ -5088,44 +5222,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
+                               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 +5286,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
@@ -5183,10 +5319,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;
@@ -7123,10 +7261,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 +7781,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,14 +7841,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[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
-                                               ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
-                       );
+                       parts = rurl.exec( s.url.toLowerCase() ) || false;
+                       s.crossDomain = parts && ( parts.join(":") + ( parts[ 3 ] ? "" : parts[ 1 ] === "http:" ? 80 : 443 ) ) !==
+                               ( ajaxLocParts.join(":") + ( ajaxLocParts[ 3 ] ? "" : ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) );
                }
 
                // Convert data if not already a string
@@ -8405,12 +8540,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 +8562,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;
@@ -9069,7 +9203,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 +9218,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 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..d80680f 100644 (file)
  * 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
@@ -114,6 +118,7 @@ $.suggestions = {
         * @param value Mixed Value to set property with
         */
        configure: function ( context, property, value ) {
+               var newCSS;
                // Validate creation using fallback values
                switch( property ) {
                        case 'fetch':
@@ -121,6 +126,7 @@ $.suggestions = {
                        case 'special':
                        case 'result':
                        case '$region':
+                       case 'expandFrom':
                                context.config[property] = value;
                                break;
                        case 'suggestions':
@@ -134,19 +140,77 @@ $.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.empty();
@@ -344,14 +408,15 @@ $.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: {
@@ -365,7 +430,7 @@ $.fn.suggestions = function () {
                                        'delay': 120,
                                        'submitOnClick': false,
                                        'maxExpandFactor': 3,
-                                       'positionFromLeft': true,
+                                       'expandFrom': 'auto',
                                        'highlightInput': false
                                }
                        };
@@ -377,7 +442,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,22 +474,9 @@ $.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' )
@@ -476,6 +528,7 @@ $.fn.suggestions = function () {
                                                } )
                                )
                                .appendTo( $( 'body' ) );
+
                        $(this)
                                // Stop browser autocomplete from interfering
                                .attr( 'autocomplete', 'off')
@@ -521,6 +574,7 @@ $.fn.suggestions = function () {
                                        $.suggestions.cancel( context );
                                } );
                }
+
                // Store the context for next time
                $(this).data( 'suggestions-context', context );
        } );
index 3ef71d5..75dd2f1 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
 
                        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' );
        }
 
        /**
        }
 
        function setHeadersCss( table, $headers, list, css, msg ) {
-               // Remove all header information
-               $headers.removeClass( css[0] ).removeClass( css[1] );
+               // Remove all header information and reset titles to default message
+               $headers.removeClass( css[0] ).removeClass( css[1] ).attr( 'title', msg[1] );
 
                var h = [];
                $headers.each( function ( offset ) {
                };
        }
 
+       /**
+        * 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 = {
                                        // Declare and cache.
                                        var $document, $headers, cache, config, sortOrder,
                                                $table = $( table ),
-                                               shiftDown = 0,
-                                               firstTime = true;
+                                               shiftDown = 0;
 
                                        // Quit if no tbody
                                        if ( !table.tBodies ) {
                                        }
                                        $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();
 
+                                       // 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 );
+
+                                       // initially build the cache for the tbody cells (to be able to sort initially)
+                                       cache = buildCache( table );
+
                                        // 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
                                                        return true;
                                                }
 
-                                               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 );
-                                               }
-
                                                // Build the cache for the tbody cells
                                                // to share between calculations for this sort action.
                                                // Re-calculated each time a sort action is performed due to possiblity
                                                        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 ( 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 );
+
+                                               // sort the table and append it to the dom
+                                               appendToTable( table, multisort( table, sortList, cache ) );
+                                       };
+
+                                       // sort initially
+                                       if ( config.sortList.length > 0 ) {
+                                               explodeRowspans( $table );
+                                               config.sortList = convertSortList( config.sortList );
+                                               $table.data( 'tablesorter' ).sort();
+                                       }
+
                                } );
                        },
 
index f0f78c2..634d02b 100644 (file)
                },
 
                submit: function () {
-                       var 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 subject, message,
+                               fb = this;
 
-                       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( code, info ) {
                                // 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..1979573
--- /dev/null
@@ -0,0 +1,5 @@
+$( function() {
+       // Apply hidpi images on DOM-ready
+       // Some may have already partly preloaded at low resolution.
+       $( 'body' ).hidpi();
+} );
\ No newline at end of file
index f0e464d..1a72ed1 100644 (file)
@@ -393,48 +393,82 @@ 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 );
                                }
                        }
@@ -794,7 +828,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 +840,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 +943,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 );
                                }
@@ -1182,17 +1265,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
diff --git a/resources/mediawiki/mediawiki.searchSuggest.js b/resources/mediawiki/mediawiki.searchSuggest.js
new file mode 100644 (file)
index 0000000..ca719ab
--- /dev/null
@@ -0,0 +1,158 @@
+/**
+ * Add search suggestions to the search form.
+ */
+( function ( mw, $ ) {
+       $( document ).ready( function ( $ ) {
+               var map,
+                       // 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' );
+
+               // 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;
+               }
+
+               // 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;
+               }
+
+               // Placeholder text for search box
+               $searchInput
+                       .attr( 'placeholder', mw.msg( 'searchsuggest-search' ) )
+                       .placeholder();
+
+               // General suggestions functionality for all search boxes
+               $( '#searchInput, #searchInput2, #powerSearchText, #searchText' )
+                       .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' );
+                       } );
+
+               // 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',
+                                                       val: '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 ) );
\ No newline at end of file
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..17487f4 100644 (file)
@@ -30,136 +30,465 @@ 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() {
+               $this->html( 'headelement' );
+               echo $this->beforeContent();
+               $this->html( 'bodytext' );
+               echo "\n";
+               echo $this->afterContent();
+               $this->html( 'dataAfterContent' );
+               $this->printTrail();
+               echo "\n</body></html>";
+       }
+       
 
        /**
+        * Language/charset variant links for classic-style skins
         * @return string
+        *
+        * @fixed
         */
-       function doBeforeContent() {
-               $mainPageObj = Title::newMainPage();
+       function variantLinks() {
+               $s = array();
+
+               $variants = $this->data['content_navigation']['variants'];
+
+               foreach ( $variants as $key => $link ) {
+                       $s[] = $this->makeListItem( $key, $link, array( 'tag' => 'span' ) );
+               }
+
+               return $this->getSkin()->getLanguage()->pipeList( $s );
+       }
+       
+       // @fixed
+       function otherLanguages() {
+               global $wgHideInterlanguageLinks;
+               if ( $wgHideInterlanguageLinks ) {
+                       return "";
+               }
 
-               $s = "\n<div id='content'>\n<div id='topbar'>" .
-                 '<table style="width: 100%;" cellspacing="0" cellpadding="8"><tr>';
+               // We override SkinTemplate->formatLanguageName() in SkinCologneBlue
+               // not to capitalize the language names.
+               $language_urls = $this->data['language_urls'];
+               if ( empty( $language_urls ) ) {
+                       return "";
+               }
 
-               $s .= '<td class="top" nowrap="nowrap">';
-               $s .= '<a href="' . htmlspecialchars( $mainPageObj->getLocalURL() ) . '">';
-               $s .= '<span id="sitetitle">' . wfMessage( 'sitetitle' )->escaped() . '</span></a>';
+               $s = array();
+               foreach ( $language_urls as $key => $data ) {
+                       $s[] = $this->makeListItem( $key, $data, array( 'tag' => 'span' ) );
+               }
 
-               $s .= '</td><td class="top" id="top-syslinks" style="width: 100%;">';
-               $s .= $this->sysLinks();
-               $s .= '</td></tr><tr><td class="top-subheader">';
+               return wfMessage( 'otherlanguages' )->text()
+                       . wfMessage( 'colon-separator' )->text()
+                       . $this->getSkin()->getLanguage()->pipeList( $s );
+       }
 
-               $s .= '<font size="-1"><span id="sitesub">';
-               $s .= wfMessage( 'sitesubtitle' )->escaped() . '</span></font>';
-               $s .= '</td><td class="top-linkcollection">';
+       // @fixed
+       function pageTitleLinks() {
+               $s = array();
+               $footlinks = $this->getFooterLinks();
+               
+               foreach ( $footlinks['places'] as $item ) {
+                       $s[] = $this->data[$item];
+               }
+               
+               return $this->getSkin()->getLanguage()->pipeList( $s );
+       }
 
-               $s .= '<font size="-1"><span id="langlinks">';
-               $s .= str_replace( '<br />', '', $this->otherLanguages() );
+       function bottomLinks() {
+               $sep = wfMessage( 'pipe-separator' )->escaped() . "\n";
 
-               $s .= $this->getSkin()->getCategories();
+               $s = '';
+               if ( $this->getSkin()->getOutput()->isArticleRelated() ) {
+                       $element[] = '<strong>' . $this->editThisPage() . '</strong>';
 
-               $s .= '<br />' . $this->pageTitleLinks();
-               $s .= '</span></font>';
+                       if ( $this->getSkin()->getUser()->isLoggedIn() ) {
+                               $element[] = $this->watchThisPage();
+                       }
 
-               $s .= "</td></tr></table>\n";
+                       $element[] = $this->talkLink();
+                       $element[] = $this->historyLink();
+                       $element[] = $this->whatLinksHere();
+                       $element[] = $this->watchPageLinksLink();
 
-               $s .= "\n</div>\n<div id='article'>";
+                       $title = $this->getSkin()->getTitle();
 
-               $notice = $this->getSkin()->getSiteNotice();
-               if( $notice ) {
-                       $s .= "\n<div id='siteNotice'>$notice</div>\n";
+                       if (
+                               $title->getNamespace() == NS_USER ||
+                               $title->getNamespace() == NS_USER_TALK
+                       ) {
+                               $id = User::idFromName( $title->getText() );
+                               $ip = User::isIP( $title->getText() );
+
+                               # Both anons and non-anons have contributions list
+                               if ( $id || $ip ) {
+                                       $element[] = $this->userContribsLink();
+                               }
+
+                               if ( $this->getSkin()->showEmailUser( $id ) ) {
+                                       $element[] = $this->emailUserLink();
+                               }
+                       }
+
+                       $s = implode( $element, $sep );
+
+                       if ( $title->getArticleID() ) {
+                               $s .= "\n<br />";
+
+                               // Delete/protect/move links for privileged users
+                               if ( $this->getSkin()->getUser()->isAllowed( 'delete' ) ) {
+                                       $s .= $this->deleteThisPage();
+                               }
+
+                               if ( $this->getSkin()->getUser()->isAllowed( 'protect' ) ) {
+                                       $s .= $sep . $this->protectThisPage();
+                               }
+
+                               if ( $this->getSkin()->getUser()->isAllowed( 'move' ) ) {
+                                       $s .= $sep . $this->moveThisPage();
+                               }
+                       }
+
+                       $s .= "<br />\n" . $this->otherLanguages();
                }
-               $s .= $this->pageTitle();
-               $s .= $this->pageSubtitle() . "\n";
+
                return $s;
        }
 
-       /**
-        * @return string
-        */
-       function doAfterContent(){
-               $s = "\n</div><br clear='all' />\n";
+       function editThisPage() {
+               if ( !$this->getSkin()->getOutput()->isArticleRelated() ) {
+                       $s = wfMessage( 'protectedpage' )->text();
+               } else {
+                       $title = $this->getSkin()->getTitle();
+                       if ( $title->quickUserCan( 'edit' ) && $title->exists() ) {
+                               $t = wfMessage( 'editthispage' )->text();
+                       } elseif ( $title->quickUserCan( 'create' ) && !$title->exists() ) {
+                               $t = wfMessage( 'create-this-page' )->text();
+                       } else {
+                               $t = wfMessage( 'viewsource' )->text();
+                       }
 
-               $s .= "\n<div id='footer'>";
-               $s .= '<table style="width: 98%;" cellspacing="0"><tr>';
+                       $s = Linker::linkKnown(
+                               $title,
+                               $t,
+                               array(),
+                               $this->getSkin()->editUrlOptions()
+                       );
+               }
 
-               $s .= '<td class="bottom">';
+               return $s;
+       }
 
-               $s .= $this->bottomLinks();
-               $s .= $this->getSkin()->getLanguage()->pipeList( array(
-                       "\n<br />" . Linker::linkKnown(
-                               Title::newMainPage()
-                       ),
-                       $this->getSkin()->aboutLink(),
-                       $this->searchForm( wfMessage( 'qbfind' )->text() )
-               ) );
+       function deleteThisPage() {
+               $diff = $this->getSkin()->getRequest()->getVal( 'diff' );
+               $title = $this->getSkin()->getTitle();
+
+               if ( $title->getArticleID() && ( !$diff ) && $this->getSkin()->getUser()->isAllowed( 'delete' ) ) {
+                       $t = wfMessage( 'deletethispage' )->text();
+
+                       $s = Linker::linkKnown(
+                               $title,
+                               $t,
+                               array(),
+                               array( 'action' => 'delete' )
+                       );
+               } else {
+                       $s = '';
+               }
+
+               return $s;
+       }
+
+       function protectThisPage() {
+               $diff = $this->getSkin()->getRequest()->getVal( 'diff' );
+               $title = $this->getSkin()->getTitle();
+
+               if ( $title->getArticleID() && ( ! $diff ) && $this->getSkin()->getUser()->isAllowed( 'protect' ) ) {
+                       if ( $title->isProtected() ) {
+                               $text = wfMessage( 'unprotectthispage' )->text();
+                               $query = array( 'action' => 'unprotect' );
+                       } else {
+                               $text = wfMessage( 'protectthispage' )->text();
+                               $query = array( 'action' => 'protect' );
+                       }
+
+                       $s = Linker::linkKnown(
+                               $title,
+                               $text,
+                               array(),
+                               $query
+                       );
+               } else {
+                       $s = '';
+               }
 
-               $s .= "\n<br />" . $this->pageStats();
+               return $s;
+       }
 
-               $s .= '</td>';
-               $s .= "</tr></table>\n</div>\n</div>\n";
+       function watchThisPage() {
+               // Cache
+               $title = $this->getSkin()->getTitle();
+
+               if ( $this->getSkin()->getOutput()->isArticleRelated() ) {
+                       if ( $this->getSkin()->getUser()->isWatched( $title ) ) {
+                               $text = wfMessage( 'unwatchthispage' )->text();
+                               $query = array(
+                                       'action' => 'unwatch',
+                                       'token' => UnwatchAction::getUnwatchToken( $title, $this->getSkin()->getUser() ),
+                               );
+                               $id = 'mw-unwatch-link';
+                       } else {
+                               $text = wfMessage( 'watchthispage' )->text();
+                               $query = array(
+                                       'action' => 'watch',
+                                       'token' => WatchAction::getWatchToken( $title, $this->getSkin()->getUser() ),
+                               );
+                               $id = 'mw-watch-link';
+                       }
 
-               if ( $this->getSkin()->qbSetting() != 0 ) {
-                       $s .= $this->quickBar();
+                       $s = Linker::linkKnown(
+                               $title,
+                               $text,
+                               array( 'id' => $id ),
+                               $query
+                       );
+               } else {
+                       $s = wfMessage( 'notanarticle' )->text();
                }
+
                return $s;
        }
 
+       function moveThisPage() {
+               if ( $this->getSkin()->getTitle()->quickUserCan( 'move' ) ) {
+                       return Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Movepage' ),
+                               wfMessage( 'movethispage' )->text(),
+                               array(),
+                               array( 'target' => $this->getSkin()->getTitle()->getPrefixedDBkey() )
+                       );
+               } else {
+                       // no message if page is protected - would be redundant
+                       return '';
+               }
+       }
+
+       function historyLink() {
+               return Linker::link(
+                       $this->getSkin()->getTitle(),
+                       wfMessage( 'history' )->escaped(),
+                       array( 'rel' => 'archives' ),
+                       array( 'action' => 'history' )
+               );
+       }
+
+       function whatLinksHere() {
+               return Linker::linkKnown(
+                       SpecialPage::getTitleFor( 'Whatlinkshere', $this->getSkin()->getTitle()->getPrefixedDBkey() ),
+                       wfMessage( 'whatlinkshere' )->escaped()
+               );
+       }
+
+       function userContribsLink() {
+               return Linker::linkKnown(
+                       SpecialPage::getTitleFor( 'Contributions', $this->getSkin()->getTitle()->getDBkey() ),
+                       wfMessage( 'contributions' )->escaped()
+               );
+       }
+
+       function emailUserLink() {
+               return Linker::linkKnown(
+                       SpecialPage::getTitleFor( 'Emailuser', $this->getSkin()->getTitle()->getDBkey() ),
+                       wfMessage( 'emailuser' )->escaped()
+               );
+       }
+
+       function watchPageLinksLink() {
+               if ( !$this->getSkin()->getOutput()->isArticleRelated() ) {
+                       return wfMessage( 'parentheses', wfMessage( 'notanarticle' )->text() )->escaped();
+               } else {
+                       return Linker::linkKnown(
+                               SpecialPage::getTitleFor( 'Recentchangeslinked', $this->getSkin()->getTitle()->getPrefixedDBkey() ),
+                               wfMessage( 'recentchangeslinked-toolbox' )->escaped()
+                       );
+               }
+       }
+
+       function talkLink() {
+               $title = $this->getSkin()->getTitle();
+               if ( NS_SPECIAL == $title->getNamespace() ) {
+                       # No discussion links for special pages
+                       return '';
+               }
+
+               $linkOptions = array();
+
+               if ( $title->isTalkPage() ) {
+                       $link = $title->getSubjectPage();
+                       switch( $link->getNamespace() ) {
+                               case NS_MAIN:
+                                       $text = wfMessage( 'articlepage' );
+                                       break;
+                               case NS_USER:
+                                       $text = wfMessage( 'userpage' );
+                                       break;
+                               case NS_PROJECT:
+                                       $text = wfMessage( 'projectpage' );
+                                       break;
+                               case NS_FILE:
+                                       $text = wfMessage( 'imagepage' );
+                                       # Make link known if image exists, even if the desc. page doesn't.
+                                       if ( wfFindFile( $link ) )
+                                               $linkOptions[] = 'known';
+                                       break;
+                               case NS_MEDIAWIKI:
+                                       $text = wfMessage( 'mediawikipage' );
+                                       break;
+                               case NS_TEMPLATE:
+                                       $text = wfMessage( 'templatepage' );
+                                       break;
+                               case NS_HELP:
+                                       $text = wfMessage( 'viewhelppage' );
+                                       break;
+                               case NS_CATEGORY:
+                                       $text = wfMessage( 'categorypage' );
+                                       break;
+                               default:
+                                       $text = wfMessage( 'articlepage' );
+                       }
+               } else {
+                       $link = $title->getTalkPage();
+                       $text = wfMessage( 'talkpage' );
+               }
+
+               $s = Linker::link( $link, $text->text(), array(), array(), $linkOptions );
+
+               return $s;
+       }
+       
        /**
         * @return string
+        * 
+        * @fixed
         */
-       function sysLinks() {
-               $li = SpecialPage::getTitleFor( 'Userlogin' );
-               $lo = SpecialPage::getTitleFor( 'Userlogout' );
+       function beforeContent() {
+               ob_start();
+?>
+<div id="content">
+       <div id="topbar">
+               <p id="sitetitle">
+                       <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="toplinks">
+                       <p id="syslinks"><?php echo $this->sysLinks() ?></p>
+                       <p id="variantlinks"><?php echo $this->variantLinks() ?></p>
+               </div>
+               <div id="linkcollection">
+                       <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">
+               <?php if ( $this->getSkin()->getSiteNotice() ) { ?>
+               <div id="siteNotice"><?php echo $this->getSkin()->getSiteNotice() ?></div>
+               <?php } ?>
+               <h1 id="firstHeading"><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;
+       }
 
-               $rt = $this->getSkin()->getTitle()->getPrefixedURL();
-               if ( 0 == strcasecmp( urlencode( $lo ), $rt ) ) {
-                       $q = array();
-               } else {
-                       $q = array( 'returnto' => $rt );
+       /**
+        * @return string
+        * 
+        * @fixed
+        */
+       function afterContent() {
+               ob_start();
+?>
+       </div>
+       <div id='footer'>
+<?php
+               // Page-related links
+               echo $this->bottomLinks();
+               echo "\n<br />";
+               
+               // 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>
+<?php echo $this->quickBar() ?>
+<?php
+               $s = ob_get_contents();
+               ob_end_clean();
+
+               return $s;
+       }
 
+       /**
+        * @return string
+        * 
+        * @fixed
+        */
+       function sysLinks() {
                $s = array(
                        $this->getSkin()->mainPageLink(),
                        Linker::linkKnown(
@@ -174,221 +503,179 @@ 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 );
        }
 
+
+
+       
+       /**
+        * @param $heading string
+        * @return string
+        * 
+        * @fixed
+        */
+       function menuHead( $heading ) {
+               return "\n<h6>" . htmlspecialchars( $heading ) . "</h6>";
+       }
+
        /**
         * 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>";
-                       }
-                       if( is_array( $browseLinks ) ) {
-                               foreach ( $browseLinks as $link ) {
-                                       if ( $link['text'] != '-' ) {
-                                               $s .= "<a href=\"{$link['href']}\">" .
-                                                       htmlspecialchars( $link['text'] ) . '</a>' . $sep;
+               $sep = "<br />\n";
+               
+               $plain_bar = $this->data['sidebar'];
+               $bar = array();
+               
+               // Massage the sidebar
+               // We want to place SEARCH at the beginning and a lot of stuff before TOOLBOX (or at the end, if it's missing)
+               $additions_done = false;
+               while ( !$additions_done ) {
+                       $bar = array(); // Empty it out
+                       
+                       // Always display search on top
+                       $bar['SEARCH'] = true;
+                               
+                       foreach ( $plain_bar as $heading => $links ) {
+                               if ( $heading == 'TOOLBOX' ) {
+                                       if( $links !== NULL ) {
+                                               // If this is not a toolbox prosthetic we inserted outselves, fill it out
+                                               $plain_bar['TOOLBOX'] = $this->getToolbox();
                                        }
+                                       
+                                       // And insert the stuff
+                                       
+                                       // "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']
+                                       );
+                                       $bar['qbedit'] = $qbedit;
+                                       $bar['qbpageoptions'] = $qbpageoptions;
+                                       
+                                       // Personal tools ("My pages")
+                                       $bar['qbmyoptions'] = $this->getPersonalTools();
+                                       foreach ( array ( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
+                                               $bar['qbmyoptions'][$key] = false;
+                                       }
+                                       
+                                       $additions_done = true;
                                }
-                       }
-                       $barnumber++;
-               }
-
-               $user = $this->getSkin()->getUser();
-
-               if ( $this->data['isarticle'] ) {
-                       $s .= $this->menuHead( 'qbedit' );
-                       $s .= '<strong>' . $this->editThisPage() . '</strong>';
-
-                       $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;
+                               
+                               // Re-insert current heading, unless it's SEARCH
+                               if ( $heading != 'SEARCH' ) {
+                                       $bar[$heading] = $plain_bar[$heading];
                                }
                        }
-                       $s .= $sep;
-
-                       $s .= $this->menuHead( 'qbpageoptions' );
-                       $s .= $this->talkLink()
-                                       . $sep . $this->commentLink()
-                                       . $sep . $this->printableLink();
-                       if ( $this->data['loggedin'] ) {
-                               $s .= $sep . $this->watchThisPage();
+                       
+                       // If TOOLBOX is missing, $additions_done is still false
+                       if ( !$additions_done ) {
+                               $plain_bar['TOOLBOX'] = false;
                        }
-
-                       $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();
+               }
+               
+               foreach ( $bar as $heading => $links ) {
+                       if ( $heading == 'SEARCH' ) {
+                               $s .= $this->menuHead( wfMessage( 'qbfind' )->text() );
+                               $s .= $this->searchForm( 'sidebar' );
+                       } elseif ( $heading == 'LANGUAGES' ) {
+                               // discard these; we display languages below page content
+                       } else {
+                               if ( $links ) {
+                                       // Use the navigation heading from standard sidebar as the "browse" section
+                                       if ( $heading == 'navigation' ) {
+                                               $heading = 'qbbrowse';
+                                       }
+                                       if ( $heading == 'TOOLBOX' ) {
+                                               $heading = 'toolbox';
+                                       }
+                                       
+                                       $headingMsg = wfMessage( $heading );
+                                       $any_link = false;
+                                       $t = $this->menuHead( $headingMsg->exists() ? $headingMsg->text() : $heading );
+                                       
+                                       foreach ( $links as $key => $link ) {
+                                               // Can be empty due to rampant sidebar massaging we're doing above
+                                               if ( $link ) {
+                                                       $any_link = true;
+                                                       $t .= $this->makeListItem( $key, $link, array( 'tag' => 'span' ) ) . $sep;
+                                               }
+                                       }
+                                       
+                                       if ( $any_link ) {
+                                               $s .= $t;
                                        }
                                }
                        }
-                       $s .= $sep;
-               }
-
-               $s .= $this->menuHead( 'qbmyoptions' );
-               if ( $this->data['loggedin'] ) {
-                       $tl = Linker::linkKnown(
-                               $user->getTalkPage(),
-                               wfMessage( 'mytalk' )->escaped()
-                       );
-                       if ( $user->getNewtalk() ) {
-                               $tl .= ' *';
-                       }
-
-                       $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>";
-               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 57b5410..aac786d 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,78 +58,25 @@ 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;
-}
-
 #pagestats {
        font-family: Verdana, Arial, sans-serif;
        color: black;
        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;
@@ -177,12 +121,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;
@@ -227,3 +171,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;
+}
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 );
index 42f5f68..2fc8907 100644 (file)
@@ -1,4 +1,25 @@
 <?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__;
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..b9f1817 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,
@@ -989,6 +991,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 +1216,7 @@ class ParserTest {
                        }
                }
 
-               $page->doEdit( $text, '', EDIT_NEW );
+               $page->doEditContent( ContentHandler::makeContent( $text, $title ), '', EDIT_NEW );
 
                $wgCapitalLinks = $oldCapitalLinks;
        }
index eb038db..fa60b42 100644 (file)
@@ -65,6 +65,30 @@ Template:inner list
 * item 1
 !! 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
+
 ###
 ### Basic tests
 ###
@@ -499,14 +523,30 @@ nowiki 3
 ### Comments
 ###
 !! test
-Comment test 1
+Comments and 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
@@ -868,6 +908,127 @@ Bug 6200: Preformatted in <blockquote>
 </p>
 !! end
 
+!!test
+Templates: Pre: 1a. Templates that break a line should suppress <pre>
+!!input
+ {{echo|}}
+!!result
+
+!!end
+
+!!test
+Templates: Pre: 1b. Templates that break a line should suppress <pre>
+!!input
+ {{echo|
+foo}}
+!!result
+<p>foo
+</p>
+!!end
+
+!! test
+Templates: Pre: 1c: Wrapping should be based on expanded content
+!! input
+ {{echo|a
+b}}
+!!result
+<pre>a
+</pre>
+<p>b
+</p>
+!!end
+
+!! test
+Templates: Pre: 1d: Wrapping should be based on expanded content
+!! input
+ {{echo|a
+b
+c
+ d
+e
+}}
+!!result
+<pre>a
+</pre>
+<p>b
+c
+</p>
+<pre>d
+</pre>
+<p>e
+</p>
+!!end
+
+!!test
+Templates: Pre: 1e. Wrapping should be based on expanded content
+!!input
+{{echo| foo}}
+
+{{echo| foo}}
+{{echo| bar}}
+
+{{echo|<!--cmt--> foo}}
+
+<!--cmt-->{{echo| foo}}
+
+{{echo|{{echo| }}bar}}
+!!result
+<pre>foo
+</pre>
+<pre>foo
+bar
+</pre>
+<pre>foo
+</pre>
+<pre>foo
+</pre>
+<pre>bar
+</pre>
+!!end
+
+###
+### Parsoid-centric tests for testing RT edge cases
+### around comments and white-space inside pre blocks
+###
+
+!!test
+1a. Pre and Comments
+!!input
+ a
+<!--a-->
+c
+!!result
+<pre>a
+</pre>
+<p>c
+</p>
+!!end
+
+!!test
+1b. Pre and Comments
+!!input
+ a
+ <!--a-->
+c
+!!result
+<pre>a
+</pre>
+<p>c
+</p>
+!!end
+
+!!test
+1c. Pre and Comments
+!!input
+<!--a-->  a
+
+ <!--a--> a
+!!result
+<pre> a
+</pre>
+<pre> a
+</pre>
+!!end
 
 ###
 ### Definition lists
@@ -1505,6 +1666,15 @@ 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
@@ -2816,6 +2986,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
@@ -3884,6 +4064,14 @@ Template parameter as link source
 </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
@@ -4160,6 +4348,47 @@ section=1
 ==Section 1==
 !! 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.
@@ -4201,11 +4430,6 @@ Templates: Template Name/Arg clash: 3. Use of named param with empty input
 ###
 ### Parsoid-centric tests to stress Parsoid's ability to RT them unchanged
 ###
-!! article
-Template:echo
-!! text
-{{{1}}}
-!! endarticle
 
 !!test
 Templates: 1. Simple use
@@ -4497,21 +4721,45 @@ Templates: Tables: 4f. Generating a single tag of a HTML table
 !!end
 
 !!test
-Templates: Pre: 1a. Templates that break a line should suppress <pre>
+Templates: Ugly nesting: 1. Quotes opened/closed across templates (echo)
 !!input
- {{echo|}}
+{{echo|''a}}{{echo|b''c''d}}{{echo|''e}}
 !!result
+<p><i>ab</i>c<i>d</i>e
+</p>
+!!end
 
+!!test
+Templates: Ugly nesting: 2. Quotes opened/closed across templates (echo_with_span)
+(PHP parser generates misnested html)
+!! options
+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
-Templates: Pre: 1b. Templates that break a line should suppress <pre>
+Templates: Ugly nesting: 3. Quotes opened/closed across templates (echo_with_div)
+(PHP parser generates misnested html)
+!! options
+disabled
 !!input
- {{echo|
-foo}}
+{{echo_with_div|''a}}{{echo_with_div|b''c''d}}{{echo_with_div|''e}}
 !!result
-<p>foo
-</p>
+<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
+
 !!end
 
 !!test
@@ -5192,6 +5440,15 @@ Image with caption
 
 !! end
 
+!! test
+Image with empty attribute
+!! input
+[[Image:foobar.jpg|right||Caption text]]
+!! 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>
+
+!! end
+
 !! test
 Image with link parameter, wiki target
 !! input
@@ -5286,7 +5543,7 @@ Thumbnail image with link parameter
 !! input
 [[Image:foobar.jpg|thumb|link=http://example.com/|Title]]
 !! 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>
+<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
 
@@ -5360,7 +5617,7 @@ 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/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>
+<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>
 
 !! end
 
@@ -5369,7 +5626,7 @@ 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/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>
+<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>
 
 !! end
 
@@ -5378,7 +5635,7 @@ BUG 1887: A ISBN with a thumbnail
 !! input
 [[Image:foobar.jpg|thumb|ISBN 1235467890]]
 !! 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>
+<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>
 
 !! end
 
@@ -5387,7 +5644,7 @@ 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/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>
+<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>
 
 !! end
 
@@ -5396,7 +5653,7 @@ 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/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>
+<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>
 
 !! end
 
@@ -5469,7 +5726,7 @@ Image caption containing another image
 !! input
 [[Image:Foobar.jpg|thumb|This is a caption with another [[Image:icon.png|image]] inside it!]]
 !! 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>
+<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
 
@@ -5489,7 +5746,7 @@ 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/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>
+<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
 
@@ -5659,6 +5916,39 @@ pst
 [[Category:Foo (bar)|Foo]]
 !! end
 
+!! test
+Category with template
+!! options
+cat
+pst
+!! input
+[[Category:{{echo|Foo}}]]
+!! result
+[[Category:{{echo|Foo}}]]
+!! end
+
+!! test
+Category with template in sort key
+!! options
+cat
+pst
+!! input
+[[Category:Foo|{{echo|Bar}}]]
+!! result
+[[Category:Foo|{{echo|Bar}}]]
+!! end
+
+!! test
+Category with template in sort key and title
+!! options
+cat
+pst
+!! input
+[[Category:{{echo|Foo}}|{{echo|Bar}}]]
+!! result
+[[Category:{{echo|Foo}}|{{echo|Bar}}]]
+!! end
+
 ###
 ### Inter-language links
 ###
@@ -5674,6 +5964,19 @@ ill
 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
 ###
@@ -6719,9 +7022,9 @@ Parser hook: empty input
 <tag></tag>
 !! result
 <pre>
-string(0) ""
-array(0) {
-}
+''
+array (
+)
 </pre>
 
 !! end
@@ -6733,8 +7036,8 @@ Parser hook: empty input using terminated empty elements
 !! result
 <pre>
 NULL
-array(0) {
-}
+array (
+)
 </pre>
 
 !! end
@@ -6746,8 +7049,8 @@ Parser hook: empty input using terminated empty elements (space before)
 !! result
 <pre>
 NULL
-array(0) {
-}
+array (
+)
 </pre>
 
 !! end
@@ -6758,9 +7061,9 @@ Parser hook: basic input
 <tag>input</tag>
 !! result
 <pre>
-string(5) "input"
-array(0) {
-}
+'input'
+array (
+)
 </pre>
 
 !! end
@@ -6772,9 +7075,9 @@ Parser hook: case insensitive
 <TAG>input</TAG>
 !! result
 <pre>
-string(5) "input"
-array(0) {
-}
+'input'
+array (
+)
 </pre>
 
 !! end
@@ -6786,9 +7089,9 @@ Parser hook: case insensitive, redux
 <TaG>input</TAg>
 !! result
 <pre>
-string(5) "input"
-array(0) {
-}
+'input'
+array (
+)
 </pre>
 
 !! end
@@ -6801,9 +7104,9 @@ noxml
 <tag><tag></tag></tag>
 !! result
 <pre>
-string(5) "<tag>"
-array(0) {
-}
+'<tag>'
+array (
+)
 </pre>&lt;/tag&gt;
 
 !! end
@@ -6814,17 +7117,13 @@ Parser hook: basic arguments
 <tag width=200 height = "100" depth = '50' square></tag>
 !! result
 <pre>
-string(0) ""
-array(4) {
-  ["width"]=>
-  string(3) "200"
-  ["height"]=>
-  string(3) "100"
-  ["depth"]=>
-  string(2) "50"
-  ["square"]=>
-  string(6) "square"
-}
+''
+array (
+  'width' => '200',
+  'height' => '100',
+  'depth' => '50',
+  'square' => 'square',
+)
 </pre>
 
 !! end
@@ -6835,11 +7134,10 @@ Parser hook: argument containing a forward slash (bug 5344)
 <tag filename='/tmp/bla'></tag>
 !! result
 <pre>
-string(0) ""
-array(1) {
-  ["filename"]=>
-  string(8) "/tmp/bla"
-}
+''
+array (
+  'filename' => '/tmp/bla',
+)
 </pre>
 
 !! end
@@ -6851,10 +7149,9 @@ Parser hook: empty input using terminated empty elements (bug 2374)
 !! result
 <pre>
 NULL
-array(1) {
-  ["foo"]=>
-  string(3) "bar"
-}
+array (
+  'foo' => 'bar',
+)
 </pre>text
 
 !! end
@@ -6869,16 +7166,12 @@ other stuff
 !! result
 <pre>
 NULL
-array(4) {
-  ["width"]=>
-  string(3) "200"
-  ["height"]=>
-  string(3) "100"
-  ["depth"]=>
-  string(2) "50"
-  ["square"]=>
-  string(6) "square"
-}
+array (
+  'width' => '200',
+  'height' => '100',
+  'depth' => '50',
+  'square' => 'square',
+)
 </pre>
 <p>other stuff
 &lt;/tag&gt;
@@ -8606,19 +8899,19 @@ image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
                        </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="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/3/3a/Foobar.jpg" width="70" height="8" /></a></div></div>
+                       <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/3/3a/Foobar.jpg" width="70" height="8" /></a></div></div>
+                       <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>
@@ -8638,14 +8931,14 @@ File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
 !! 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="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/3/3a/Foobar.jpg" width="20" height="2" /></a>
+<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/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <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>
@@ -8682,7 +8975,7 @@ caption
                        </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="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>
@@ -8690,7 +8983,7 @@ some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
                        </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="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>
@@ -8722,12 +9015,12 @@ foobar.jpg
                        </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="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/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <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>
@@ -8858,7 +9151,7 @@ Width + Height sized image (using px) (height is ignored)
 !! input
 [[Image:foobar.jpg|640x480px]]
 !! 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><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
 
@@ -8867,7 +9160,7 @@ Width-sized image (using px, no following whitespace)
 !! input
 [[Image:foobar.jpg|640px]]
 !! 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><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
 
@@ -8876,7 +9169,7 @@ Width-sized image (using px, with following whitespace - test regression from r3
 !! input
 [[Image:foobar.jpg|640px ]]
 !! 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><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
 
@@ -8885,7 +9178,7 @@ Width-sized image (using px, with preceding whitespace - test regression from r3
 !! input
 [[Image:foobar.jpg| 640px]]
 !! 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><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
 
@@ -8925,7 +9218,7 @@ Images with the "|" character in the comment
 !! input
 [[image:Foobar.jpg|thumb|An [http://test/?param1=|left|&param2=|x external] URL]]
 !! 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>
+<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>
 
 !!end
 
@@ -9919,7 +10212,7 @@ Free external link invading image caption
 !! input
 [[Image:Foobar.jpg|thumb|http://x|hello]]
 !! 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>
+<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
 
@@ -10842,7 +11135,7 @@ File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
 !! 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="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>
@@ -10861,7 +11154,7 @@ File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
 !! 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="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>
@@ -10880,7 +11173,7 @@ File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascri
 !! 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="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>
@@ -10937,6 +11230,24 @@ HttP://MediaWiki.Org/
 </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
 
 TODO:
 more images
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 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 f9e9f77..5bc36ed 100644 (file)
@@ -29,6 +29,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.
@@ -119,6 +126,41 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                return $fname;
        }
 
+       /**
+        * setUp and tearDown should (where significant)
+        * happen in reverse order.
+        */
+       protected function setUp() {
+               parent::setUp();
+
+               /*
+               //@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 );
+                       }
+               }
+
+               // Clean up open transactions
+               if ( $this->needsDB() && $this->db ) {
+                       while( $this->db->trxLevel() > 0 ) {
+                               $this->db->rollback();
+                       }
+               }
+       }
+
        protected function tearDown() {
                // Cleaning up temporary files
                foreach ( $this->tmpfiles as $fname ) {
@@ -129,16 +171,95 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        }
                }
 
-               // clean up open transactions
-               if( $this->needsDB() && $this->db ) {
+               // Clean up open transactions
+               if ( $this->needsDB() && $this->db ) {
                        while( $this->db->trxLevel() > 0 ) {
                                $this->db->rollback();
                        }
                }
 
+               // Restore mw globals
+               foreach ( $this->mwGlobals as $key => $value ) {
+                       $GLOBALS[$key] = $value;
+               }
+               $this->mwGlobals = array();
+
                parent::tearDown();
        }
 
+       /**
+        * 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 ) {
+               if ( !is_array( $pairs ) ) {
+                       $key = $pairs;
+                       $this->mwGlobals[$key] = $GLOBALS[$key];
+                       $GLOBALS[$key] = $value;
+               } else {
+                       foreach ( $pairs as $key => $value ) {
+                               $this->mwGlobals[$key] = $GLOBALS[$key];
+                               $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() {
                return $this->db->getType() == 'oracle' ? self::ORA_DB_PREFIX : self::DB_PREFIX;
        }
@@ -212,11 +333,12 @@ 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' ) );
                }
        }
 
@@ -368,7 +490,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 +666,77 @@ 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!" );
+       }
 }
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..46aaa4b 100644 (file)
@@ -2,19 +2,25 @@
 
 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() {
+               $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() {
+               $this->title = null;
                $this->article = null;
 
        }
@@ -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..5ac05ba 100644 (file)
@@ -11,17 +11,15 @@ 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( '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 +43,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 +86,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 +106,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..97fffda 100644 (file)
@@ -6,7 +6,7 @@
 
 class CdbTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
                if ( !CdbReader::haveExtension() ) {
                        $this->markTestSkipped( 'Native CDB support is not available' );
                }
diff --git a/tests/phpunit/includes/ContentHandlerTest.php b/tests/phpunit/includes/ContentHandlerTest.php
new file mode 100644 (file)
index 0000000..797a3ee
--- /dev/null
@@ -0,0 +1,410 @@
+<?php
+
+/**
+ * @group ContentHandler
+ *
+ * @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.
+ *
+ * @group Database
+ */
+class ContentHandlerTest extends MediaWikiTestCase {
+
+       public function setup() {
+               parent::setup();
+
+               global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
+
+               $wgExtraNamespaces[ 12312 ] = 'Dummy';
+               $wgExtraNamespaces[ 12313 ] = 'Dummy_talk';
+
+               $wgNamespaceContentModels[ 12312 ] = "testing";
+               $wgContentHandlers[ "testing" ] = 'DummyContentHandlerForTesting';
+
+               MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+               $wgContLang->resetNamespaces(); # reset namespace cache
+       }
+
+       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();
+       }
+
+       public function dataGetDefaultModelFor() {
+               //NOTE: assume that the Help namespace default to wikitext content
+               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 function dataGetLocalizedName() {
+               return array(
+                       array( null, null ),
+                       array( "xyzzy", null ),
+
+                       array( CONTENT_MODEL_JAVASCRIPT, '/javascript/i' ), //XXX: depends on content language
+               );
+       }
+
+       /**
+        * @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 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 function dataMakeContent() {
+               //NOTE: assume the Help namespace defaults to wikitext content
+               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 ) {
+               global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers;
+
+               $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 $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 ) {
+               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/CssContentTest.php b/tests/phpunit/includes/CssContentTest.php
new file mode 100644 (file)
index 0000000..b6e8d29
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @group ContentHandler
+ *
+ * @group Database
+ *        ^--- needed, because we do need the database to test link updates
+ */
+class CssContentTest extends JavascriptContentTest {
+
+       public function newContent( $text ) {
+               return new CssContent( $text );
+       }
+
+
+       public 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( // NOTE: assumes default settings for $wgTextModelsToParse
+                                       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 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 ),
+               );
+       }
+
+}
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..eee5f37 100644 (file)
@@ -6,14 +6,14 @@
 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.",
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..14bc0bb 100644 (file)
@@ -5,18 +5,18 @@
  */
 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;
+               $this->setMwGlobals( array(
+                       'wgShowDBErrorBacktrace' => true,
+                       'wgLanguageCode' => 'en',
+                       'wgContLang' => Language::factory( 'en' ),
+                       'wgLang' => Language::factory( 'en' ),
+                       'wgMemc' => new EmptyBagOStuff,
+                       'wgAlwaysUseTidy' => false,
+                       'wgCleanSignatures' => true,
+               ) );
                
                $this->options = new ParserOptions;
                $this->options->setTemplateCallback( array( __CLASS__, 'statelessFetchTemplate' ) );
@@ -27,11 +27,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 +62,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 +73,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 +89,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..35c7f8f 100644 (file)
@@ -25,7 +25,7 @@
 class FauxResponseTest extends MediaWikiTestCase {
        var $response;
 
-       function setUp() {
+       protected function setUp() {
                $this->response = new FauxResponse;
        }
 
index 9097d30..e8aabfd 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),
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 8867cd5..cb6e6c4 100644 (file)
@@ -32,7 +32,7 @@ class wfExpandUrl extends MediaWikiTestCase {
         *
         * @return array
         */
-       public function provideExpandableUrls() {
+       public static function provideExpandableUrls() {
                $modes = array( 'http', 'https' );
                $servers = array(
                        'http' => 'http://example.com',
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 6e936aa..95a6cb0 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' => '' ) ),
+                       'Empty string is always quoted'
+               );
+               $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' => '' ) ),
-                       'Value with an empty string'
+                       'Attribtue values are always quoted (wgWellFormedXml): Empty string'
                );
-               $this->AssertEquals(
+               $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,12 +404,11 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider providesHtml5InputTypes
+        * @dataProvider provideHtml5InputTypes
         */
        function testHtmlElementAcceptsNewHtml5TypesInHtml5Mode( $HTML5InputType ) {
-               $this->enableHTML5();
                $this->assertEquals(
-                       '<input 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',
@@ -409,19 +446,18 @@ class HtmlTest extends MediaWikiTestCase {
         * @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' )
                );
 
@@ -449,7 +485,7 @@ class HtmlTest extends MediaWikiTestCase {
                        'canvas', array( 'width' => 300 )
                );
 
-               $cases[] = array( '<command />',
+               $cases[] = array( '<command>',
                        'command', array( 'type' => 'command' )
                );
 
@@ -463,18 +499,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 +535,37 @@ 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>',
+               # <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 +589,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..155bd31 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' ),
@@ -131,6 +131,10 @@ class HttpTest extends MediaWikiTestCase {
         * handles header reporting on redirect pages, and will need to be
         * rewritten when bug 29232 is taken care of (high-level handling of
         * HTTP redirects).
+        * @group Broken
+        *  MWHttpRequestTester's constructor is private, needs to use
+        *  MWHttpRequestTester::factory instead. However the objects coming
+        *  from that won't have MWHttpRequestTester::setRespHeaders...
         */
        function testRelativeRedirections() {
                $h = new MWHttpRequestTester( 'http://oldsite/file.ext' );
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', '::' ),
diff --git a/tests/phpunit/includes/JavascriptContentTest.php b/tests/phpunit/includes/JavascriptContentTest.php
new file mode 100644 (file)
index 0000000..d3810af
--- /dev/null
@@ -0,0 +1,272 @@
+<?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 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( // NOTE: assumes default settings for $wgTextModelsToParse
+                                                       array( 'World' => 0 ) ) ) ),
+
+                       // @todo: more...?
+               );
+       }
+
+       public function dataGetSection() {
+               return array(
+                       array( WikitextContentTest::$sections,
+                              "0",
+                              null
+                       ),
+                       array( WikitextContentTest::$sections,
+                              "2",
+                              null
+                       ),
+                       array( WikitextContentTest::$sections,
+                              "8",
+                              null
+                       ),
+               );
+       }
+
+       public 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 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 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 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 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 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 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 ),
+               );
+       }
+
+}
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..9fc6f4d 100644 (file)
@@ -4,24 +4,28 @@ 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' ),
+                       '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 +75,7 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
        }
 
        function testGetPreferredVariantHeaderUserVsUrl() {
-               global $wgRequest, $wgUser, $wgContLang;
+               global $wgContLang, $wgRequest, $wgUser;
 
                $wgContLang = Language::factory( 'tg-latn' );
                $wgRequest->setVal( 'variant', 'tg' );
index 4946200..bc71ab7 100644 (file)
@@ -10,30 +10,35 @@ 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() {
                $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 +148,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..5de5cc9 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;
        }
 
        /**
@@ -504,24 +455,20 @@ class MWNamespaceTest extends MediaWikiTestCase {
         */
        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..4487210 100644 (file)
@@ -5,7 +5,7 @@
 
 class PathRouterTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
                $router = new PathRouter;
                $router->add("/wiki/$1");
                $this->basicRouter = $router;
@@ -182,7 +182,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 +193,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..a1f808c 100644 (file)
@@ -220,7 +220,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 +238,7 @@ class RecentChangeTest extends MediaWikiTestCase {
                // $this->context->msg( 'undo-summary', .. );
        }
 
-        * --
-        */
+*/
 
        /**
         * @param $expected String Expected IRC text without colors codes
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..8d2a7bd 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,34 @@ class RevisionStorageTest extends MediaWikiTestCase {
        }
 
        public function setUp() {
+               global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
+
+               $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;
+
+               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 +83,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 +115,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 +164,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 +197,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 +221,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 +256,25 @@ 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()
+       {
+               $orig = $this->makeRevision( array( 'text' => 'hello hello.' ) );
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertEquals( 'hello hello.', $rev->getContent()->getNativeData() );
+       }
+
        /**
         * @covers Revision::revText
         */
@@ -228,17 +292,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 +351,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 +369,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 +387,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 +405,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 +436,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataUserWasLastToEdit
+        * @dataProvider provideUserWasLastToEdit
         */
        public function testUserWasLastToEdit( $sinceIdx, $expectedLast ) {
                $userA = \User::newFromName( "RevisionStorageTest_userA" );
@@ -342,18 +450,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 +474,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 +486,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 +498,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 +510,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..00e7119 100644 (file)
@@ -1,25 +1,56 @@
 <?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' ),
                        '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 +138,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 +154,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..2f55de4 100644 (file)
@@ -5,18 +5,23 @@ 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' ),
+               ) );
        }
 
        /**
         * Anything cleanup you need to do should go here.
         */
-       function tearDown() {
+       protected function tearDown() {
                parent::tearDown();
        }
 
@@ -40,8 +45,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 +85,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 ac9971e..c593d2f 100644 (file)
@@ -2,7 +2,11 @@
 
 class SanitizerTest extends MediaWikiTestCase {
 
-       function setUp() {
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( 'wgCleanupPresentationalAttributes', true );
+
                AutoLoader::loadClass( 'Sanitizer' );
        }
 
@@ -110,20 +114,22 @@ 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 provideDeprecatedAttributes() {
+       function testDeprecatedAttributesDisabled() {
+               global $wgCleanupPresentationalAttributes;
+
+               $wgCleanupPresentationalAttributes = false;
+
+               $this->assertEquals( ' clear="left"', Sanitizer::fixTagAttributes( 'clear="left"', 'br' ), 'Deprecated attributes are not converted to styles when enabled.' );
+       }
+
+       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;' ),
@@ -170,7 +176,7 @@ class SanitizerTest extends MediaWikiTestCase {
                );
        }
 
-       function provideCssCommentsFixtures() {
+       public static function provideCssCommentsFixtures() {
                /** array( <expected>, <css>, [message] ) */
                return array(
                        array( ' ', '/**/' ),
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..4e0d2f4 100644 (file)
@@ -25,7 +25,7 @@ function getSiteParams( $conf, $wiki ) {
 class SiteConfigurationTest extends MediaWikiTestCase {
        var $mConf;
 
-       function setUp() {
+       protected function setUp() {
                $this->mConf = new SiteConfiguration;
 
                $this->mConf->suffixes = array( 'wiki' );
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;
diff --git a/tests/phpunit/includes/TextContentTest.php b/tests/phpunit/includes/TextContentTest.php
new file mode 100644 (file)
index 0000000..10934b4
--- /dev/null
@@ -0,0 +1,371 @@
+<?php
+
+/**
+ * @group ContentHandler
+ *
+ * @group Database
+ *        ^--- needed, because we do need the database to test link updates
+ */
+class TextContentTest extends MediaWikiTestCase {
+
+       public function setup() {
+               global $wgUser;
+
+               // anon user
+               $wgUser = new User();
+               $wgUser->setName( '127.0.0.1' );
+
+               $this->context = new RequestContext( new FauxRequest() );
+               $this->context->setTitle( Title::newFromText( "Test" ) );
+               $this->context->setUser( $wgUser );
+       }
+
+       public function newContent( $text ) {
+               return new TextContent( $text );
+       }
+
+
+       public 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 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 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 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 isRedirect( $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 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 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 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 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 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" );
+                       }
+               }
+       }
+
+}
index cd027c5..db4162f 100644 (file)
@@ -1,28 +1,21 @@
 <?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' ),
+               ) );
 
-       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 +36,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..44fd690 100644 (file)
@@ -1,8 +1,44 @@
 <?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 $wgExtraNamespaces, $wgNamespaceContentModels, $wgContLang;
+
+               $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;
+
+               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 +51,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataEquals
+        * @dataProvider provideEquals
         */
        public function testEquals( $titleA, $titleB, $expectedBool ) {
                $titleA = Title::newFromText( $titleA );
@@ -25,7 +61,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 +75,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataInNamespace
+        * @dataProvider provideInNamespace
         */
        public function testInNamespace( $title, $ns, $expectedBool ) {
                $title = Title::newFromText( $title );
@@ -54,7 +90,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 +104,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 +169,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 +183,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 +198,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 +224,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 +244,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 +268,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..55c5610 100644 (file)
@@ -4,31 +4,43 @@
  * @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,
+                       '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 +65,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                        $this->user = $this->userUser;
                }
-       }
 
-       function tearDown() {
-               parent::tearDown();
        }
 
        function setUserPerm( $perm ) {
@@ -81,9 +90,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                } else {
                        $this->user = $this->altUser;
                }
-
-               global $wgUser;
-               $wgUser = $this->user;
        }
 
        function testQuickPermissions() {
@@ -225,30 +231,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 +293,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 +313,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 +348,8 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
        }
 
        function testSpecialsAndNSPermissions() {
+               global $wgNamespaceProtection;
                $this->setUser( $this->userName );
-               global $wgUser;
-               $wgUser = $this->user;
 
                $this->setTitle( NS_SPECIAL );
 
@@ -359,8 +368,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 +386,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 +450,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 +464,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 +504,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 +521,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 +528,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 +552,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 +640,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..0a3f6f6 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() {
@@ -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..316e6f5 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' ),
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..e98f5a7 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 /**
+* @group ContentHandler
 * @group Database
 * ^--- important, causes temporary tables to be used instead of the real database
 **/
@@ -11,30 +12,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 +53,15 @@ 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 ) ) {
+                       $title = Title::newFromText( $title );
+               }
 
                $p = new WikiPage( $title );
 
@@ -59,30 +70,113 @@ 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 = Title::newFromText( $page );
+               }
+
+               if ( $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() {
+               $title = Title::newFromText( "WikiPageTest_testDoEditContent" );
+
+               $page = $this->newPage( $title );
+
+               $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 +185,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 +207,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 +220,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 +258,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 +279,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 +375,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 +386,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 +401,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,141 +424,160 @@ 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 ) {
+       public function testIsCountable( $title, $model, $text, $mode, $expected ) {
                global $wgArticleCountMethod;
 
-               $old = $wgArticleCountMethod;
+               $oldArticleCountMethod = $wgArticleCountMethod;
                $wgArticleCountMethod = $mode;
 
-               $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;
+
+               $wgArticleCountMethod = $oldArticleCountMethod;
 
                $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();
                $po = $page->getParserOutput( $opt );
@@ -412,6 +590,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 +629,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,14 +679,28 @@ 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 );
        }
 
+       /**
+        * @dataProvider dataReplaceSection
+        */
+       public function testReplaceSectionContent( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
+               $page = $this->createPage( $title, $text, $model );
+
+               $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
+               $c = $page->replaceSectionContent( $section, $content, $sectionTitle );
+
+               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
+       }
+
        /* @todo FIXME: fix this!
        public function testGetUndoText() {
                global $wgDiff3;
@@ -538,19 +761,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 +803,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 +817,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 +838,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 +885,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 +935,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 +957,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 +973,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 +983,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() ) );
+       }
+
+}
+
+
diff --git a/tests/phpunit/includes/WikitextContentHandlerTest.php b/tests/phpunit/includes/WikitextContentHandlerTest.php
new file mode 100644 (file)
index 0000000..8aeb529
--- /dev/null
@@ -0,0 +1,199 @@
+<?php
+
+/**
+ * @group ContentHandler
+ */
+class WikitextContentHandlerTest extends MediaWikiTestCase {
+
+       /**
+        * @var ContentHandler
+        */
+       var $handler;
+
+       public function setup() {
+               $this->handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
+       }
+
+       public function teardown() {
+       }
+
+       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 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 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 ) {
+               global $wgDiff3;
+
+               if ( !$wgDiff3 ) {
+                       $this->markTestSkipped( "Can't test merge3(), since \$wgDiff3 is not configured" );
+               }
+
+               if ( !file_exists( $wgDiff3 ) ) {
+                       #XXX: this sucks, since it uses arcane internal knowledge about TextContentHandler::merge3 and wfMerge.
+                       $this->markTestSkipped( "Can't test merge3(), since \$wgDiff3 is misconfigured: can't find $wgDiff3" );
+               }
+
+               // 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 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 ) {
+               global $wgLanguageCode, $wgContLang;
+
+               $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/WikitextContentTest.php b/tests/phpunit/includes/WikitextContentTest.php
new file mode 100644 (file)
index 0000000..c1332a6
--- /dev/null
@@ -0,0 +1,374 @@
+<?php
+
+/**
+ * @group ContentHandler
+ *
+ * @group Database
+ *        ^--- needed, because we do need the database to test link updates
+ */
+class WikitextContentTest extends TextContentTest {
+
+       public function newContent( $text ) {
+               return new WikitextContent( $text );
+       }
+
+       public function dataGetParserOutput() {
+               return array(
+                       array("WikitextContentTest_testGetParserOutput", CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "<p>hello <i>world</i>\n</p>"),
+                       // @todo: more...?
+               );
+       }
+
+       public 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" );
+                       }
+               }
+       }
+
+
+       static $sections =
+
+"Intro
+
+== stuff ==
+hello world
+
+== test ==
+just a test
+
+== foo ==
+more stuff
+";
+
+       public 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 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 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 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 function dataGetRedirectTarget() {
+               return array(
+                       array( '#REDIRECT [[Test]]',
+                              'Test',
+                       ),
+                       array( '#REDIRECT Test',
+                              null,
+                       ),
+                       array( '* #REDIRECT [[Test]]',
+                              null,
+                       ),
+               );
+       }
+
+       public 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 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 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 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 2407c15..75bd922 100644 (file)
@@ -35,7 +35,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..81b32c2 100644 (file)
@@ -3,7 +3,7 @@
 class ZipDirectoryReaderTest extends MediaWikiTestCase {
        var $zipDir, $entries;
 
-       function setUp() {
+       protected function 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..624cf49 100644 (file)
  */
 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 +52,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,19 +93,107 @@ 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() );
        }
 
-       function testEditSection() {
-               $this->markTestIncomplete( "not yet implemented" );
+       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"
+                       ),
+               );
        }
 
-       function testUndo() {
+       /**
+        * @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() {
                $this->markTestIncomplete( "not yet implemented" );
        }
 
-       function testEditNonText() {
+       function testUndo() {
                $this->markTestIncomplete( "not yet implemented" );
        }
 }
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..4684c55 100644 (file)
@@ -9,7 +9,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
 
        private static $Success = array( 'options' => 'success' );
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
 
                $this->mUserMock = $this->getMockBuilder( 'User' )
index 2566c6c..d903714 100644 (file)
@@ -6,7 +6,7 @@
  */
 class ApiPurgeTest extends ApiTestCase {
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
                $this->doLogin();
        }
index a4b9dc7..dbf02f7 100644 (file)
@@ -6,7 +6,7 @@
  */
 class ApiQueryTest extends ApiTestCase {
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
                $this->doLogin();
        }
index 3cec99a..de52175 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,7 +41,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
 
        }
 
-       protected function doApiRequest( Array $params, Array $session = null, $appendModule = false, User $user = null ) {
+       protected function doApiRequest( array $params, array $session = null, $appendModule = false, User $user = null ) {
                global $wgRequest, $wgUser;
 
                if ( is_null( $session ) ) {
@@ -86,7 +86,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 ),
index e37cd44..0c9f749 100644 (file)
@@ -8,15 +8,15 @@
  */
 class DatabaseSQLTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function 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 +29,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                ) ), $sqlText );
        }
 
-       function dataSelectSQLText() {
+       public static function provideSelectSQLText() {
                return array(
                        array(
                                array(
@@ -106,7 +106,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataConditional
+        * @dataProvider provideConditional
         */
        function testConditional( $sql, $sqlText ) {
                $this->assertEquals( trim( $this->db->conditional(
@@ -116,7 +116,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                ) ), $sqlText );
        }
 
-       function dataConditional() {
+       public static function provideConditional() {
                return array(
                        array(
                                array(
index d226598..216de84 100644 (file)
@@ -24,7 +24,9 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
 class DatabaseSqliteTest extends MediaWikiTestCase {
        var $db;
 
-       public function setUp() {
+       protected function setUp() {
+               parent::setUp();
+
                if ( !Sqlite::isPresent() ) {
                        $this->markTestSkipped( 'No SQLite support detected' );
                }
index dc12ba5..a8a6b48 100644 (file)
@@ -7,11 +7,11 @@
 class DatabaseTest extends MediaWikiTestCase {
        var $db, $functionTest = false;
 
-       function setUp() {
+       protected function setUp() {
                $this->db = wfGetDB( DB_MASTER );
        }
 
-       function tearDown() {
+       protected function tearDown() {
                if ( $this->functionTest ) {
                        $this->dropFunctions();
                        $this->functionTest = false;
index afd1cb8..c7bea3b 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 );
index 246b291..4f338d3 100644 (file)
@@ -3,7 +3,7 @@
 class MWDebugTest extends MediaWikiTestCase {
 
 
-       function setUp() {
+       protected function setUp() {
                // Make sure MWDebug class is enabled
                static $MWDebugEnabled = false;
                if( !$MWDebugEnabled ) {
@@ -15,7 +15,7 @@ class MWDebugTest extends MediaWikiTestCase {
                wfSuppressWarnings();
        }
 
-       function tearDown() {
+       protected function tearDown() {
                wfRestoreWarnings();
        }
 
index a2dc5c6..7201eec 100644 (file)
@@ -10,7 +10,7 @@ class FileBackendTest extends MediaWikiTestCase {
        private $filesToPrune = array();
        private static $backendToUse;
 
-       function setUp() {
+       protected function setUp() {
                global $wgFileBackends;
                parent::setUp();
                $tmpPrefix = wfTempDir() . '/filebackend-unittest-' . time() . '-' . mt_rand();
@@ -50,7 +50,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        'parallelize' => 'implicit',
                        'backends'    => array(
                                array(
-                                       'name'          => 'localmutlitesting1',
+                                       'name'          => 'localmultitesting1',
                                        'class'         => 'FSFileBackend',
                                        'lockManager'   => 'nullLockManager',
                                        'containerPaths' => array(
@@ -59,7 +59,7 @@ class FileBackendTest extends MediaWikiTestCase {
                                        'isMultiMaster' => false
                                ),
                                array(
-                                       'name'          => 'localmutlitesting2',
+                                       'name'          => 'localmultitesting2',
                                        'class'         => 'FSFileBackend',
                                        'lockManager'   => 'nullLockManager',
                                        'containerPaths' => array(
@@ -72,7 +72,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->filesToPrune = array();
        }
 
-       private function baseStorePath() {
+       private static function baseStorePath() {
                return 'mwstore://localtesting';
        }
 
@@ -183,7 +183,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "FileBackend::extensionFromPath on path '$path'" );
        }
 
-       function provider_testExtensionFromPath() {
+       public static function provider_testExtensionFromPath() {
                return array(
                        array( 'mwstore://backend/container/path.txt', 'txt' ),
                        array( 'mwstore://backend/container/path.svg.png', 'png' ),
@@ -248,11 +248,11 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertBackendPathsConsistent( array( $dest ) );
        }
 
-       public function provider_testStore() {
+       public static function provider_testStore() {
                $cases = array();
 
                $tmpName = TempFSFile::factory( "unittests_", 'txt' )->getPath();
-               $toPath = $this->baseStorePath() . '/unittest-cont1/e/fun/obj1.txt';
+               $toPath = self::baseStorePath() . '/unittest-cont1/e/fun/obj1.txt';
                $op = array( 'op' => 'store', 'src' => $tmpName, 'dst' => $toPath );
                $cases[] = array(
                        $op, // operation
@@ -337,11 +337,11 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertBackendPathsConsistent( array( $source, $dest ) );
        }
 
-       public function provider_testCopy() {
+       public static function provider_testCopy() {
                $cases = array();
 
-               $source = $this->baseStorePath() . '/unittest-cont1/e/file.txt';
-               $dest = $this->baseStorePath() . '/unittest-cont2/a/fileMoved.txt';
+               $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(
@@ -428,11 +428,11 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertBackendPathsConsistent( array( $source, $dest ) );
        }
 
-       public function provider_testMove() {
+       public static function provider_testMove() {
                $cases = array();
 
-               $source = $this->baseStorePath() . '/unittest-cont1/e/file.txt';
-               $dest = $this->baseStorePath() . '/unittest-cont2/a/fileMoved.txt';
+               $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(
@@ -515,10 +515,10 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertBackendPathsConsistent( array( $source ) );
        }
 
-       public function provider_testDelete() {
+       public static function provider_testDelete() {
                $cases = array();
 
-               $source = $this->baseStorePath() . '/unittest-cont1/e/myfacefile.txt';
+               $source = self::baseStorePath() . '/unittest-cont1/e/myfacefile.txt';
 
                $op = array( 'op' => 'delete', 'src' => $source );
                $cases[] = array(
@@ -611,10 +611,10 @@ class FileBackendTest extends MediaWikiTestCase {
        /**
         * @dataProvider provider_testCreate
         */
-       public function provider_testCreate() {
+       public static function provider_testCreate() {
                $cases = array();
 
-               $dest = $this->baseStorePath() . '/unittest-cont2/a/myspacefile.txt';
+               $dest = self::baseStorePath() . '/unittest-cont2/a/myspacefile.txt';
 
                $op = array( 'op' => 'create', 'content' => 'test test testing', 'dst' => $dest );
                $cases[] = array(
@@ -678,7 +678,7 @@ class FileBackendTest extends MediaWikiTestCase {
        private function doTestDoQuickOperations() {
                $backendName = $this->backendClass();
 
-               $base = $this->baseStorePath();
+               $base = self::baseStorePath();
                $files = array(
                        "$base/unittest-cont1/e/fileA.a",
                        "$base/unittest-cont1/e/fileB.a",
@@ -800,16 +800,16 @@ class FileBackendTest extends MediaWikiTestCase {
                $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'
+                       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',
@@ -911,7 +911,7 @@ class FileBackendTest extends MediaWikiTestCase {
        function provider_testGetFileStat() {
                $cases = array();
 
-               $base = $this->baseStorePath();
+               $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 );
@@ -937,29 +937,43 @@ class FileBackendTest extends MediaWikiTestCase {
        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)." );
+               $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)." );
+               }
 
-               $this->assertEquals( $content, $newContents,
-                       "Contents read match data at $source ($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 = $this->baseStorePath();
+               $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;
        }
@@ -982,27 +996,53 @@ class FileBackendTest extends MediaWikiTestCase {
        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)." );
+               $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)." );
+               }
 
-               $tmpFile = $this->backend->getLocalCopy( array( 'src' => $source ) );
-               $this->assertNotNull( $tmpFile,
-                       "Creation of local copy of $source 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)." );
+               }
 
-               $contents = file_get_contents( $tmpFile->getPath() );
-               $this->assertNotEquals( false, $contents, "Local copy of $source exists ($backendName)." );
+               $obj = new stdClass();
+               $tmpFile->bind( $obj );
        }
 
        function provider_testGetLocalCopy() {
                $cases = array();
 
-               $base = $this->baseStorePath();
+               $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;
        }
@@ -1025,30 +1065,80 @@ class FileBackendTest extends MediaWikiTestCase {
        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)." );
+               $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)." );
+               }
 
-               $contents = file_get_contents( $tmpFile->getPath() );
-               $this->assertNotEquals( false, $contents, "Local copy of $source exists ($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 = $this->baseStorePath();
+               $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_testPrepareAndClean
         */
@@ -1063,7 +1153,7 @@ class FileBackendTest extends MediaWikiTestCase {
        }
 
        function provider_testPrepareAndClean() {
-               $base = $this->baseStorePath();
+               $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 ),
@@ -1111,7 +1201,7 @@ class FileBackendTest extends MediaWikiTestCase {
        private function doTestRecursiveClean() {
                $backendName = $this->backendClass();
 
-               $base = $this->baseStorePath();
+               $base = self::baseStorePath();
                $dirs = array(
                        "$base/unittest-cont1/e/a",
                        "$base/unittest-cont1/e/a/b",
@@ -1165,7 +1255,7 @@ class FileBackendTest extends MediaWikiTestCase {
        }
 
        private function doTestDoOperations() {
-               $base = $this->baseStorePath();
+               $base = self::baseStorePath();
 
                $fileA = "$base/unittest-cont1/e/a/b/fileA.txt";
                $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
@@ -1251,7 +1341,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        // concurrency orientated
        private function doTestDoOperationsPipeline() {
-               $base = $this->baseStorePath();
+               $base = self::baseStorePath();
 
                $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
                $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
@@ -1349,7 +1439,7 @@ class FileBackendTest extends MediaWikiTestCase {
        }
 
        private function doTestDoOperationsFailing() {
-               $base = $this->baseStorePath();
+               $base = self::baseStorePath();
 
                $fileA = "$base/unittest-cont2/a/b/fileA.txt";
                $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
@@ -1424,7 +1514,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
        private function doTestGetFileList() {
                $backendName = $this->backendClass();
-               $base = $this->baseStorePath();
+               $base = self::baseStorePath();
 
                // Should have no errors
                $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont-notexists" ) );
@@ -1581,7 +1671,7 @@ class FileBackendTest extends MediaWikiTestCase {
        private function doTestGetDirectoryList() {
                $backendName = $this->backendClass();
 
-               $base = $this->baseStorePath();
+               $base = self::baseStorePath();
                $files = array(
                        "$base/unittest-cont1/e/test1.txt",
                        "$base/unittest-cont1/e/test2.txt",
@@ -1832,7 +1922,7 @@ class FileBackendTest extends MediaWikiTestCase {
                foreach ( $this->filesToPrune as $file ) {
                        @unlink( $file );
                }
-               $containers = array( 'unittest-cont1', 'unittest-cont2', 'unittest-cont3' );
+               $containers = array( 'unittest-cont1', 'unittest-cont2' );
                foreach ( $containers as $container ) {
                        $this->deleteFiles( $container );
                }
@@ -1840,12 +1930,11 @@ class FileBackendTest extends MediaWikiTestCase {
        }
 
        private function deleteFiles( $container ) {
-               $base = $this->baseStorePath();
+               $base = self::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->quickDelete( array( 'src' => "$base/$container/$file" ) );
                        }
                }
                $this->backend->clean( array( 'dir' => "$base/$container", 'recursive' => 1 ) );
@@ -1861,8 +1950,4 @@ class FileBackendTest extends MediaWikiTestCase {
        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..692a5f9 100644 (file)
@@ -5,7 +5,7 @@
  */
 class ExifRotationTest extends MediaWikiTestCase {
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
                $this->handler = new BitmapHandler();
                $filePath = __DIR__ . '/../../data/media';
@@ -33,7 +33,7 @@ class ExifRotationTest extends MediaWikiTestCase {
                $wgEnableAutoRotation = true;
        }
 
-       public function tearDown() {
+       protected function tearDown() {
                global $wgShowEXIF, $wgEnableAutoRotation;
                $wgShowEXIF = $this->show;
                $wgEnableAutoRotation = $this->oldAuto;
@@ -43,7 +43,7 @@ class ExifRotationTest extends MediaWikiTestCase {
 
        /**
         *
-        * @dataProvider providerFiles
+        * @dataProvider provideFiles
         */
        function testMetadata( $name, $type, $info ) {
                if ( !BitmapHandler::canRotate() ) {
@@ -56,7 +56,7 @@ class ExifRotationTest extends MediaWikiTestCase {
 
        /**
         *
-        * @dataProvider providerFiles
+        * @dataProvider provideFiles
         */
        function testRotationRendering( $name, $type, $info, $thumbs ) {
                if ( !BitmapHandler::canRotate() ) {
@@ -94,12 +94,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 +135,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 +150,7 @@ class ExifRotationTest extends MediaWikiTestCase {
 
        /**
         *
-        * @dataProvider providerFilesNoAutoRotate
+        * @dataProvider provideFilesNoAutoRotate
         */
        function testRotationRenderingNoAutoRotate( $name, $type, $info, $thumbs ) {
                global $wgEnableAutoRotation;
@@ -188,7 +189,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..ee1c6f8 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 class PNGMetadataExtractorTest extends MediaWikiTestCase {
 
-       function setUp() {
+       protected function setUp() {
                $this->filePath = __DIR__ . '/../../data/media/';
        }
        /**
@@ -60,6 +60,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 +73,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..007ce46 100644 (file)
@@ -2,19 +2,19 @@
 
 class SVGMetadataExtractorTest extends MediaWikiTestCase {
 
-       function setUp() {
+       protected function 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 +38,7 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
                }
        }
 
-       function providerSvgFiles() {
+       public static function provideSvgFiles() {
                $base = __DIR__ . '/../../data/media';
                return array(
                        array(
@@ -81,7 +81,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..be02dd7 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 class XMPTest extends MediaWikiTestCase {
 
-       function setUp() {
+       protected function setUp() {
                if ( !wfDl( 'xml' ) ) {
                        $this->markTestSkipped( 'Requires libxml to do XMP parsing' );
                }
@@ -14,7 +14,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 +25,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
index 0e15653..2588691 100644 (file)
@@ -13,7 +13,7 @@
                $this->assertEquals( $format, $detector->detectFormatName( $userAgent ) );
        }
 
-       public function provideTestFormatName() {
+       public static 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' ),
index 3164531..46ef5da 100644 (file)
@@ -29,9 +29,10 @@ class MagicVariableTest extends MediaWikiTestCase {
        );
 
        /** setup a basic parser object */
-       function setUp() {
-               global $wgContLang;
-               $wgContLang = Language::factory( 'en' );
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( 'wgContLang', Language::factory( 'en' ) );
 
                $this->testParser = new Parser();
                $this->testParser->Options( new ParserOptions() );
@@ -47,8 +48,10 @@ class MagicVariableTest extends MediaWikiTestCase {
        }
 
        /** destroy parser (TODO: is it really neded?)*/
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->testParser );
+
+               parent::tearDown();
        }
 
        ############### TESTS #############################################
index ff6e472..804726b 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,7 +31,7 @@ class NewParserTest extends MediaWikiTestCase {
 
        protected $file = false;
 
-       function setUp() {
+       protected function setUp() {
                global $wgContLang, $wgNamespaceProtection, $wgNamespaceAliases;
                global $wgHooks, $IP;
                $wgContLang = Language::factory( 'en' );
@@ -100,7 +100,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;
                }
@@ -303,7 +303,7 @@ class NewParserTest extends MediaWikiTestCase {
                        'wgNoFollowLinks' => true,
                        'wgNoFollowDomainExceptions' => array(),
                        'wgThumbnailScriptPath' => false,
-                       'wgUseImageResize' => false,
+                       'wgUseImageResize' => true,
                        'wgUseTeX' => isset( $opts['math'] ),
                        'wgMathDirectory' => $uploadDir . '/math',
                        'wgLocaltimezone' => 'UTC',
@@ -524,6 +524,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..d537b6e 100644 (file)
@@ -8,7 +8,7 @@ class ParserPreloadTest extends MediaWikiTestCase {
        private $testParserOptions;
        private $title;
 
-       function setUp() {
+       protected function setUp() {
                $this->testParserOptions = new ParserOptions();
 
                $this->testParser = new Parser();
@@ -18,7 +18,7 @@ class ParserPreloadTest extends MediaWikiTestCase {
                $this->title = Title::newFromText( 'Preload Test' );
        }
 
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->testParser );
                unset( $this->title );
        }
index fee5674..d82fc6c 100644 (file)
@@ -5,7 +5,7 @@ class PreprocessorTest extends MediaWikiTestCase {
        var $mPPNodeCount = 0;
        var $mOptions;
 
-       function setUp() {
+       protected function setUp() {
                global $wgParserConf;
                $this->mOptions = new ParserOptions();
                $name = isset( $wgParserConf['preprocessorClass'] ) ? $wgParserConf['preprocessorClass'] : 'Preprocessor_DOM';
index 957907c..395e1a0 100644 (file)
@@ -1,22 +1,17 @@
 <?php
 
 /**
- * This class is not directly tested. Instead it is extended by SearchDbTest.
  * @group Search
  * @group Database
  */
 class SearchEngineTest extends MediaWikiTestCase {
        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
@@ -33,6 +28,10 @@ class SearchEngineTest extends MediaWikiTestCase {
                $this->search = new $searchType( $this->db );
        }
 
+       protected function tearDown() {
+               unset( $this->search );
+       }
+
        function pageExists( $title ) {
                return false;
        }
@@ -41,6 +40,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 +66,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 +95,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 +104,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..e8358f3
--- /dev/null
@@ -0,0 +1,282 @@
+<?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
+ *
+ * @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' => '42' );
+
+               $argLists[] = array( 'global_key' => '42', '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 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..f102309 100644 (file)
@@ -14,7 +14,7 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
         */
        protected $rc;
 
-       function setUp() {
+       protected function setUp() {
        }
 
        /** helper to test SpecialRecentchanges::buildMainQueryConds() */
@@ -120,7 +120,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..2679088 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageAmTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Am' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index b23e053..84507c5 100644 (file)
@@ -8,10 +8,10 @@
 class LanguageArTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Ar' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 735ccc6..3135ca8 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageBeTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Be' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 765cdb8..11aacb6 100644 (file)
@@ -3,10 +3,10 @@
 class LanguageBeTaraskTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Be-tarask' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index e1e2a13..00f4e13 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageBhTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Bh' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index b6631c0..39391af 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageBsTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Bs' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index dda29f9..862de52 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageCsTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'cs' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index f8186d7..5d5d60c 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageCuTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'cu' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index e9f9e41..406a943 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageCyTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'cy' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index ab7f931..516b9ee 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageDsbTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'dsb' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 8538744..0a29028 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageFrTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'fr' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index fbd9f11..9535cb1 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageGaTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'ga' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 24574bd..e6bfdd7 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageGdTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'gd' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 3d298b9..18cf225 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageGvTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'gv' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 7833da7..6205320 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageHeTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'he' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index ead9e02..bb3b5fa 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageHiTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Hi' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 4f1c66b..6f0ca1b 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageHrTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'hr' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 803c772..d336e81 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageHsbTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'hsb' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index adbd37e..3181868 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageHuTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Hu' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 7990bdf..2885707 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageHyTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'hy' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index ab88946..78ff445 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageKshTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'ksh' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 0fd9167..60b4945 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageLnTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'ln' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 0d7c7d3..821e028 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageLtTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Lt' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 0636da5..bb0dc6c 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageLvTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'lv' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 06b5654..d6ac643 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageMgTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'mg' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index cf5ec3d..21a9e41 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageMkTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'mk' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 8c4b0b2..9af2389 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageMlTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Ml' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 533e590..4f208d9 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageMoTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'mo' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 421bb38..4d25347 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageMtTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'mt' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index cf979cd..c8cfbb6 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageNlTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Nl' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index ea39362..1e70997 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageNsoTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'nso' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index e56d4b7..a543640 100644 (file)
@@ -9,10 +9,10 @@
 class LanguagePlTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'pl' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 5270f6f..9bf01a4 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageRoTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'ro' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 7a1f193..189a96c 100644 (file)
 class LanguageRuTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'ru' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 065ec29..51cfd2f 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageSeTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'se' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 931c82f..62f2775 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageSgsTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Sgs' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index b8169ae..1d8ae7c 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageShTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'sh' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 4cfd840..25823cf 100644 (file)
 class LanguageSkTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'sk' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index c1f7569..76de0fc 100644 (file)
 class LanguageSlTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'sl' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index b7e72e9..cf14477 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageSmaTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'sma' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index d44ecf8..7be4589 100644 (file)
@@ -19,10 +19,10 @@ class LanguageSrTest extends MediaWikiTestCase {
        /* Language object. Initialized before each test */
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'sr' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 7025449..d8ec2e9 100644 (file)
@@ -7,10 +7,10 @@ class LanguageTest extends MediaWikiTestCase {
         */
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'en' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
@@ -36,7 +36,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                9.45,
                                array(),
-                               '9.5s',
+                               '9.5 s',
                                'formatTimePeriod() rounding (<10s)'
                        ),
                        array(
@@ -48,7 +48,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                9.95,
                                array(),
-                               '10s',
+                               '10 s',
                                'formatTimePeriod() rounding (<10s)'
                        ),
                        array(
@@ -60,7 +60,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                59.55,
                                array(),
-                               '1m 0s',
+                               '1 min 0 s',
                                'formatTimePeriod() rounding (<60s)'
                        ),
                        array(
@@ -72,7 +72,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                119.55,
                                array(),
-                               '2m 0s',
+                               '2 min 0 s',
                                'formatTimePeriod() rounding (<1h)'
                        ),
                        array(
@@ -84,7 +84,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                3599.55,
                                array(),
-                               '1h 0m 0s',
+                               '1 h 0 min 0 s',
                                'formatTimePeriod() rounding (<1h)'
                        ),
                        array(
@@ -96,7 +96,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                7199.55,
                                array(),
-                               '2h 0m 0s',
+                               '2 h 0 min 0 s',
                                'formatTimePeriod() rounding (>=1h)'
                        ),
                        array(
@@ -108,7 +108,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                7199.55,
                                'avoidseconds',
-                               '2h 0m',
+                               '2 h 0 min',
                                'formatTimePeriod() rounding (>=1h), avoidseconds'
                        ),
                        array(
@@ -120,7 +120,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                7199.55,
                                'avoidminutes',
-                               '2h 0m',
+                               '2 h 0 min',
                                'formatTimePeriod() rounding (>=1h), avoidminutes'
                        ),
                        array(
@@ -132,7 +132,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                172799.55,
                                'avoidseconds',
-                               '48h 0m',
+                               '48 h 0 min',
                                'formatTimePeriod() rounding (=48h), avoidseconds'
                        ),
                        array(
@@ -144,7 +144,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                259199.55,
                                'avoidminutes',
-                               '3d 0h',
+                               '3 d 0 h',
                                'formatTimePeriod() rounding (>48h), avoidminutes'
                        ),
                        array(
@@ -156,7 +156,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 +168,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                176399.55,
                                'avoidminutes',
-                               '2d 1h',
+                               '2 d 1 h',
                                'formatTimePeriod() rounding (>48h), avoidminutes'
                        ),
                        array(
@@ -180,7 +180,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 +192,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 +204,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(
@@ -1065,5 +1065,30 @@ class LanguageTest extends MediaWikiTestCase {
                        array( 10000, 'MMMMMMMMMM' ),
                );
        }
+
+       /**
+        * @dataProvider providePluralData
+        */
+       function testConvertPlural( $expected, $number, $forms ) {
+               $chosen = $this->lang->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'
+                       ) ),
+               );
+       }
 }
 
index 4bfaa00..175cdb9 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageTiTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Ti' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index a1facd1..e03531f 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageTlTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Tl' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index bda4c9d..a3cacc2 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageTrTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Tr' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 60fafb0..2b6f707 100644 (file)
 class LanguageUkTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Uk' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 7238728..0314649 100644 (file)
@@ -19,10 +19,10 @@ class LanguageUzTest extends MediaWikiTestCase {
        /* Language object. Initialized before each test */
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'uz' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
index 172f19b..08312ce 100644 (file)
@@ -9,10 +9,10 @@
 class LanguageWaTest extends MediaWikiTestCase {
        private $lang;
 
-       function setUp() {
+       protected function setUp() {
                $this->lang = Language::factory( 'Wa' );
        }
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->lang );
        }
 
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..149845e 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,7 +76,7 @@ class BackupDumperPageTest extends DumpTestCase {
 
        }
 
-       public function setUp() {
+       protected function setUp() {
                parent::setUp();
 
                // Since we will restrict dumping by page ranges (to allow
@@ -95,14 +106,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 +132,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 +157,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 +178,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 +202,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 +217,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 +242,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 +257,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 +311,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 +332,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 +345,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 +360,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 +373,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 +388,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..7079e0e
--- /dev/null
@@ -0,0 +1,149 @@
+<?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"
+                       . "\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..05bb5c8
--- /dev/null
@@ -0,0 +1,491 @@
+// 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 Sun, 07 Oct 2012 07:30:16 +0000
+
+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 23a93a7..4f86eb9 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;
+               for ( c = 0, len = charstr.length; c < len; c += 1 ) {
+                       $input
+                               .val( function ( i, val ) {
+                                       // Add character to the value
+                                       return val + charstr.charAt( 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' );
 
-               $elA = $( '<input>' )
+               $el = $( '<input type="text"/>' )
+                       .attr( 'maxlength', '7' )
+                       .appendTo( '#qunit-fixture' )
+                       .byteLimit( 12, function ( val ) {
+                               return val;
+                       } );
+
+               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();
-
-               // 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)' );
        });
 
-}( jQuery ) );
+}( jQuery, mediaWiki ) );
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..cf309df
--- /dev/null
@@ -0,0 +1,20 @@
+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' );
+});
index 16d8170..291c6b8 100644 (file)
@@ -107,6 +107,24 @@ 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,
@@ -158,6 +176,81 @@ tableTest(
        }
 );
 
+// Sample data set to test multiple column sorting
+var header  = [ 'column1' , 'column2'],
+       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'
+       );
+} );
 
 // Regression tests!
 tableTest(
@@ -306,7 +399,7 @@ tableTest(
        planets,
        planetsRowspan,
        function ( $table ) {
-               // Modify the table to have a multiuple-row-spanning cell:
+               // 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.
@@ -317,13 +410,29 @@ tableTest(
                $table.find( '.headerSort:eq(0)' ).click();
        }
 );
+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 multiuple-row-spanning cell:
+               // 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.
@@ -414,6 +523,24 @@ tableTest(
        }
 );
 
+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();
+
+       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 ) {
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 58e56ad..be59f1a 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;
 
@@ -161,83 +224,190 @@ 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.a',
+               function () {
+                       assert.equal(
+                               $element.css( 'float' ),
+                               'right',
+                               'style is applied'
+                       );
+               },
+               {
+                       'all': '.mw-test-implement-a { float: right; }'
+               },
+               {}
+       );
+
+       mw.loader.load([
+               'test.implement.a'
+       ]);
+} );
+
+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' );
+
+       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'
+       );
+
+       mw.loader.implement(
+               'test.implement.b',
+               function () {
+                       assertStyleAsync( assert, $element2, 'float', 'left', function () {
+                               assert.notEqual( $element1.css( 'text-align' ), 'center', 'print style is not applied' );
+
+                               QUnit.start();
+                       } );
+                       assertStyleAsync( assert, $element3, 'float', 'right', function () {
+                               assert.notEqual( $element1.css( 'text-align' ), 'center', 'print style is not applied' );
+
+                               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' )
+                               ]
+                       }
+               },
+               {}
+       );
+
+       mw.loader.load([
+               'test.implement.b'
+       ]);
+} );
+
+// 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' );
+
+       assert.notEqual(
+               $element.css( 'float' ),
+               'right',
+               'style is clear'
        );
 
        mw.loader.implement(
-               'test.implement',
+               'test.implement.c',
                function () {
-                       var styleTestTimeout, styleTestStart, styleTestSince;
+                       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)' );
+
+                               QUnit.start();
+                       } );
+               },
+               {
+                       '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' ), 'ready', 'module state is "ready" while implement() is executing javascript' );
+                       assert.equal( mw.loader.getState( 'test.implement.import' ), 'ready', 'module state is "ready" while implement() is executing javascript' );
 
-                       $element = $( '<div class="mw-test-loaderimplement">Foo bar</div>' ).appendTo( '#qunit-fixture' );
+                       $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' );
 
-                       // 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';
-                       }
-
-                       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")'
-                                       );
-
-                                       assert.equal( $element.css( 'text-align' ),'center',
-                                               'CSS styles after the @import are working ("text-align: center")'
-                                       );
-
-                                       // Async done
-                                       QUnit.start();
-
-                                       return;
-                               }
-                               // Otherwise, keep polling
-                               setTimeout( styleTestLoop, 100 );
-                       }
+                       assertStyleAsync( assert, $element, 'float', 'right', function () {
+                               assert.equal( $element.css( 'text-align' ),'center',
+                                       'CSS styles after the @import rule are working'
+                               );
 
-                       // Start the loop
-                       styleTestStart = new Date().getTime();
-                       styleTestLoop();
+                               QUnit.start();
+                       } );
                },
                {
-                       "all": "@import url('"
-                               + styleTestUrl
-                               + "');\n"
-                               + '.mw-test-loaderimplement { text-align: center; }'
+                       'css': [
+                               '@import url(\''
+                               + urlStyleTest( '.mw-test-implement-import', 'float', 'right' )
+                               + '\');\n'
+                               + '.mw-test-implement-import { text-align: center; }'
+                       ]
                },
                {
-                       "test-foobar": "Hello Foobar, $1!"
+                       'test-foobar': 'Hello Foobar, $1!'
                }
        );
 
@@ -245,6 +415,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'],
@@ -368,21 +551,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 +645,5 @@ QUnit.test( 'mw.html', 13, function ( assert ) {
                'html.element DIV (attribs + content)' );
 
 });
+
+}( mediaWiki ) );
index 39e18c9..4b2e923 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;
@@ -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..362f304 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -153,6 +153,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,11 +174,6 @@ 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__ );
index 0c9b702..db388d2 100644 (file)
@@ -22,4 +22,4 @@
  * @ingroup Media
  */
 
-require './thumb.php'; 
+require './thumb.php';